不要问我8.19的题为什么今天才写完,因为我弱啊

T1 扫雷(mine)

Problem戳这里

Solution:

显然,\(ans = min_{i=1}^n \frac{bi}{ai}\),令cnt为满足ans的个数,方案数即\(2^{cnt }-1\),用快速幂来求。

另外,本题卡精度,你当然可以向XMJJSW一样写一个分数类,也可以对输入的数成\(10^8\), 用整形判断

不过最方便的还是设个eps,取个1e-12即可以了。

#include<iostream>
#include<cstdio>
#include<algorithm>
#define MN 1000005
double a[MN],b[MN];
long long num,n,ans;
#define mod 998442553
#define eps 1e-12
#define sign(a) ((a>(-eps))-(a<eps))
inline bool cmp(const int&x,const int&y){return sign(a[x]*b[y]-b[x]*a[y])==1;
}
long long Quick_pow(long long m,long long p){long long res=1;while(p){if(p&1) res=(res*m)%mod,p-=1;else m=(m*m)%mod,p>>=1;}return res;
}
int main(){freopen("mine.in","r",stdin);freopen("mine.out","w",stdout);int T;scanf("%d\n",&T);while(T--){scanf("%d",&n);register int i;for(i=1;i<=n;i++) scanf("%lf",&a[i]);for(i=1;i<=n;i++) scanf("%lf",&b[i]);ans=1;num=0;for(i=2;i<=n;i++) if(cmp(i,ans)) ans=i;for(i=1;i<=n;i++){if(sign(a[i]*b[ans]-a[ans]*b[i])==0) num++;}if(sign(b[ans]-a[ans]*10000.0)==1){puts("Impossible");continue;}num=(Quick_pow(2,num)+mod-1)%mod;printf("%.8lf %lld\n",b[ans]/a[ans],num);}return 0;
}

T2 信息组的裁员(cut)

Problem戳这里

Solution:

对于30%的数据,可以使用O(\(m^2\))的简单dp。

对于60%的数据,可以贪心,也很好想。

对于100%的数据,考虑贪心的优化。

官方题解:


嗯,完美。

//30分的dp
#include<iostream>
#include<cstdio>
#include<algorithm>
inline long long read(){long long x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;
}
#define MN 6000005
long long n,m,a[MN],q[MN];
long long num,sum,f[2][MN];
int main(){freopen("cut.in","r",stdin);freopen("cut.out","w",stdout);n=read();m=read();register int i,j;for(i=1;i<=n;i++) a[i]=read(),q[i]=q[i-1]+a[i];for(i=1;i<=n;i++) if(a[i]>=0){j=i;num++;while(a[i+1]>=0&&i<n) i++;sum+=q[i]-q[j-1];}if(num<=m) return 0*printf("%lld\n",sum);int now=1,last=0;for(i=1;i<=n-m+1;i++) f[0][i]=std::max(f[0][i-1],q[i]);for(i=2;i<=m;i++){f[now][i]=q[i];for(j=i+1;j<=i+n-m;j++) f[now][j]=a[j]+std::max(f[now][j-1],f[last][j-1]);for(j=i+1;j<=i+n-m;j++) f[now][j]=std::max(f[now][j-1],f[now][j]);now^=1;last^=1;}printf("%lld\n",f[last][n]);return 0;
}
#include<bits/stdc++.h>
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*f;
}
#define abs(a) (((a)>0)?(a):-(a))
#define cmin(a,b) (a>(b)?a=(b),1:0)
#define cmax(a,b) (a<(b)?a=(b),1:0)
#define dmin(a,b) ((a)<(b)?(a):(b))
#define dmax(a,b) ((a)>(b)?(a):(b))
typedef long long ll;
#define MN 6000005
struct data{ll val;int pos;data(ll v=0,int p=0){val=v;pos=p;}bool operator< (const data &o) const{return val<o.val||val==o.val&&pos<o.pos;}bool operator<=(const data &o) const{return val<o.val||val==o.val&&pos<=o.pos;}
}t[MN],mx,mx2;
ll a[MN],ans;
int remain,n,m,q[MN],hq,tq,cnt,l[MN],r[MN],L[MN],R[MN];
bool inq[MN],del[MN],Del[MN];
void AddQue(int i){if(i&&(!inq[i])&&data(abs(a[i]),i)<=mx) q[++tq]=i,inq[i]=true;
}
void dele(int x){if((!x)||del[x]) return ;r[l[x]]=r[x];l[r[x]]=l[x];del[x]=true;
}
void Dele(int x){if((!x)||Del[x]) return ;remain--;R[L[x]]=R[x];L[R[x]]=L[x];Del[x]=true;dele(x);
}
void Merge(int x){if(Del[x]) return ;int lef=L[x],rig=R[x];if(lef&&abs(a[lef])<abs(a[x])) return ;if(rig&&abs(a[rig])<abs(a[x])) return ;Dele(lef);Dele(rig);a[x]+=a[lef]+a[rig];lef&&rig?AddQue(x):Dele(x);AddQue(lef);AddQue(rig);
}
int main(){freopen("cut.in","r",stdin);freopen("cut.out","w",stdout);n=read();m=read();int i,j,x;for(i=1,j=0;i<=n;i++){a[++j]=read();if(a[j]==0||j==1&&a[j]<0)--j;if(j>1&&(a[j]>0)^(a[j-1]<0)) a[j-1]+=a[j],--j; }if(j>0&&a[j]<0) --j;for(i=0;i<=j;i++)r[i]=R[i]=(i+1)%(j+1),l[i]=L[i]=(i+j)%(j+1);remain=j;while(1){cnt=0;hq=1;tq=0;for(i=r[0];i;i=r[i]) t[++cnt]=data(abs(a[i]),i);if(remain<(m<<1)) break;int mid=(remain-(m<<1)+1)>>1;std::nth_element(t+1,t+dmin(mid,cnt)+1,t+cnt+1);mx=t[dmin(mid,cnt)];std::nth_element(t+1,t+dmin(mid*3,cnt)+1,t+cnt+1);mx2=t[dmin(mid*3,cnt)];for(i=r[0];i;i=r[i]){data cur(abs(a[i]),i);if(mx2<cur) dele(i);else AddQue(i);}for(;hq<=tq;++hq)inq[q[hq]]=false,Merge(q[hq]);}ans=0;for(i=R[0];i;i=R[i]) if(a[i]>0) ans+=1ll*a[i];printf("%lld\n",ans);return 0;
}

T3 已傻的结合(ishhac)

Problem戳这里

Solution:

  1. dp方程:(a=0的时候)

    \[f_{k,i,j}=min_{x}^n\ max \{f_{k-1,i,x},g_{x,j}\}\]其中,g[x][j]表示x到j的边权。

  2. 方程转移的过程,可以用类似矩阵快速幂的方式

  3. 因为T<=4,所以图的一个周期是12,所以\[G_i=G_{i \ mod \ 12}\].

    分别求出这12个矩阵,命名为A1~A12,则最终矩阵是

    \[R= A_{12}^{\left\lfloor\frac{K}{12}\right\rfloor}\Phi A_{K\ mod\ 12}\]

    用矩阵快速幂求\(A_{12}^{\left\lfloor\frac{K}{12}\right\rfloor}\)即可。

膜一下大佬的代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int inf = 0x3f3f3f3f;
typedef long long LL;
LL ri() {char c = getchar(); LL x = 0; for(;c < '0' || c > '9'; c = getchar()) ;for(;c >= '0' && c <= '9';  c = getchar()) x = (x << 1) + (x << 3) - '0' + c; return x;
}
struct Maxtir {int n, m[60][60];void Init() {n = 0; std::memset(m, 0x3f, sizeof(m));}Maxtir operator * (Maxtir a) {Maxtir b; b.n = a.n;for(int i = 1;i <= n; ++i)for(int j = 1;j <= n; ++j) {b.m[i][j] = inf;for(int k = 1;k <= n; ++k)b.m[i][j] = std::min(b.m[i][j], std::max(a.m[k][j], m[i][k]));}return b;}
}a, b, c[13];
int n, m, s, t; LL K;
void Pow(Maxtir &a, LL x) {Maxtir b = a; x--; for(;x; b = b * b, x >>= 1) if(x & 1) a = a * b;}
int main() {freopen("ishaac.in","r",stdin);freopen("ishaac.out","w",stdout);for(int C = ri(); C--;) {a.Init(); n = ri(); m = ri(); s = ri(); t = ri(); K = ri(); a.n = n;for(int i = 1, u, v, w;i <= m; ++i)u = ri(), v = ri(), w = ri(), a.m[u][v] = a.m[v][u] = w;for(int i = 1;i <= 12; ++i) c[i] = a;int nf = ri();for(int i = 1, T, j, x, k;i <= nf; ++i)for(T = ri(), j = 0;j < T; ++j)for(x = ri(), k = j;k <= 12; k += T)for(int p = 1;p <= n; ++p)c[k].m[p][x] = inf;a = c[1];if(K <= 12) {for(int i = 2;i <= K; ++i) a = a * c[i];a.m[s][t] == inf ? puts("impossible") : printf("%d\n", a.m[s][t]);continue;}for(int i = 2;i <= 12; ++i) a = a * c[i];Pow(a, K / 12);for(int i = 1;i <= K % 12; ++i) a = a * c[i];a.m[s][t] == inf ? puts("impossible") : printf("%d\n", a.m[s][t]);}return 0;
}

Blog来自PaperCloud,未经允许,请勿转载,TKS!

转载于:https://www.cnblogs.com/PaperCloud/p/9527320.html

[20180819]四校联考相关推荐

  1. NOIP模拟赛 四校联考 递推 + 分类讨论 + 树上期望

    NOIP 模拟题 题目名称兔子被子蚊子 源程序文件名rabbit.cpp quilt.cpp mosquito.cpp 输入文件名rabbit.in quilt.in mosquito.in 输出文件 ...

  2. [四校联考P3] 区间颜色众数 (主席树)

    主席树 Description 给定一个长度为 N 颜色序列A,有M个询问:每次询问一个区间里是否有一种颜色的数量超过了区间的一半,并指出是哪种颜色. Input 输入文件第一行有两个整数:N和C 输 ...

  3. [20190113]四校联考

    T1 数位DP,太菜了打挂只有10分-- Code //2019.1.14 12:25~12:47 PaperCloud #include<bits/stdc++.h> #define l ...

  4. [4.9福建四校联考]

    来自FallDream的博客,未经允许,请勿转载 奇怪的O(n)大赛,三道题数据都是几百万,真吓人. ------------------------------------------------- ...

  5. 2017-3-19四校联考

    T1输出0有20分结果我输出1爆0(题目说精度差为整数有40%的分数,结果告诉我只能差0.5--),T2打了20分暴力,T3交了个感觉能拿50分的结果是正解--被卡常了一个点,总分110/300 T1 ...

  6. 2/19 福建四校联考

    1.设计图案 给你一个n*m的矩阵,每个格子必须填或者不能填,要用环和1*2的小方块填满它,求方案数. 比如3*2,每个格子都必须填 有6种填法. n*m<=300 当时一看就觉得不可做然后就放 ...

  7. [20180826]四校联考

    T1谜题(nazo) Problem Here Solution 先把所有点的开关状态压成一个二进制数 按一个按钮就相当于异或上一个二进制数 显然不会按同一个按钮两次 枚举\(\left\lfloor ...

  8. [20180812]四校联考

    T1 消失的无向图(missing) 题目描述 从前有一张n个点的无向图,边权都是正整数.但现在所有的边都消失了,只留下任意两点之间的最短路. 你现在想知道,所有边的边权和至少是多少. ​ 输入格式 ...

  9. 4246. 【五校联考6day2】san (Standard IO)

    4246. [五校联考6day2]san (Standard IO) Time Limits: 1000 ms  Memory Limits: 262144 KB  Detailed Limits D ...

最新文章

  1. html产品列表页的设计,产品列表页.html
  2. table列最小宽度 vue_vue中获取滚动table的可视页面宽度调整表头与列对齐(每列宽度不都相同)...
  3. matlab如何截取图像的中间部分_利用matlab提取并分割RGB图像中的某一个已知像素值的图像...
  4. Linux内核设计与实现总结。
  5. 全球首家!B站上线“杜比视界”给UP主用,“观众眼睛要被养刁了”
  6. 纯JS制作的窗户雨滴效果
  7. wordpress 介绍
  8. 交错级数如何判断收敛_从微分方程的级数解到两个特殊方程(1):关于平凡点的解...
  9. zabbix性能优化
  10. Win32路径操作相关API
  11. 【牛客 - 1080D】tokitsukaze and Event(最短路,思维)
  12. 桶分类 算法_桶分类算法
  13. python程序写完后点哪个运行快_让 Python 代码运行更快的最佳方式!
  14. JSP技术模型(五)JSP隐含变量
  15. 潜龙号开启水下机器人_国内首个智能绞吸机器人开展水下取土作业
  16. [AHOI2004]数字迷阵 结论+矩乘
  17. 辞职前一定要三思的八个问题
  18. Don't Panic! KRACK 没你想象的那么糟
  19. 分别使用多线程\多进程\协程+paramiko在华为交换机批量快速进行配置(eNSP模拟器)
  20. matlab保存bln文件,气象万千(冯锦明课题组)-软件程序

热门文章

  1. **Java有哪些悲观锁的实现_Redis 分布式锁的正确实现方式(Java 版)
  2. php strrew,友价域名交易系统nginx环境的伪静态规则
  3. 浅谈volatile关键字
  4. python webshell_linux下python版webshell后门查杀工具
  5. 电脑桌面便签_电脑上哪些便签有提醒功能?求一款好用的电脑桌面提醒便签软件...
  6. go语言 html 5 gui,仅需简单 5 步,给你的 Golang 程序添加 GUI (使用 Electron )
  7. 纯新手DSP编程--5.29--基础类DSP模块 API
  8. vue使用ajax库,Vue 中使用Ajax请求
  9. 高中信息技术——Flash动画制作刷题点整理(一)
  10. redis数据类型之sorted set