标签:ios 比较 continue n+1 条件 更新 失败 ons 整数
共m行,如果能战胜第k个大佬(让他的自信值恰好等于0),那么第k行输出1,否则输出0。
正解:$DP$
这题实在是太巧妙了。。感觉自己思想江化了。。
首先我们设$f[i][j]$表示前$i$天,自信值为$j$,最多可以有多少天不刷题。
我们设最大值为$D$,这$D$天是可以自由安排的,我们先考虑怼大佬的情况。
我们设$d[f][l]$表示讽刺值为$f$,等级值为$l$,最少需要多少天,我们限制住$D$天的限制以后,可以发现,状态数很少,于是我们直接$bfs$求出$d$就可以了。
然后对于每个状态,我们用一个二元组$(d,f)$记录讽刺值为$f$需要多少天。我们怼了两次以后,剩下的天数可以使用比较弱的还嘴(当然可能并不需要怼两次,所以我们要加入$(0,0)$的二元组)。那么我们现在要满足的条件只有两个:$f1+f2<=c$且$D-d1-d2>=c-f1-f2$。移项后可发现要满足$D-c>=d1-f1+d2-f2$。
那么我们把状态按照$f$排序,枚举其中一次怼,用单调指针来扫另一次怼,记录另一次怼的最小值,如果发现满足等式那就可以直接输出$1$了。
1 //It is made by wfj_2048~ 2 #include <algorithm> 3 #include <iostream> 4 #include <complex> 5 #include <cstring> 6 #include <cstdlib> 7 #include <cstdio> 8 #include <vector> 9 #include <cmath> 10 #include <queue> 11 #include <stack> 12 #include <map> 13 #include <set> 14 #define inf (1<<30) 15 #define N (4000010) 16 #define il inline 17 #define RG register 18 #define ll long long 19 #define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout) 20 21 using namespace std; 22 23 map <int,map<int,int> > d; 24 25 struct data{ int d,f; }p[N]; 26 27 int f[110][110],a[110],w[110],c[110],q[N],F[N],L[N],n,m,mc,mx,D,cnt; 28 29 il int gi(){ 30 RG int x=0,q=1; RG char ch=getchar(); 31 while ((ch<‘0‘ || ch>‘9‘) && ch!=‘-‘) ch=getchar(); 32 if (ch==‘-‘) q=-1,ch=getchar(); 33 while (ch>=‘0‘ && ch<=‘9‘) x=x*10+ch-48,ch=getchar(); 34 return q*x; 35 } 36 37 il int cmp(const data &a,const data &b){ return a.f<b.f; } 38 39 il void bfs(){ 40 RG int h=0,t=1; d[F[t]=1][L[t]=0]=q[t]=1; 41 while (h<t){ 42 ++h; RG int x=d[F[h]][L[h]]; 43 if (x==D) continue; 44 RG int FF=F[h],LL=L[h]; 45 if (!d[FF][LL+1]){ 46 ++t,F[t]=FF,L[t]=LL+1; 47 d[F[t]][L[t]]=q[t]=x+1; 48 } 49 if ((ll)FF*(ll)LL<=mx && !d[FF*LL][LL]){ 50 ++t,F[t]=FF*LL,L[t]=LL; 51 d[F[t]][L[t]]=q[t]=x+1; 52 } 53 } 54 p[++cnt]=(data){0,0}; 55 for (RG int i=1;i<=t;++i) 56 p[++cnt]=(data){q[i],F[i]}; 57 sort(p+1,p+cnt+1,cmp); return; 58 } 59 60 il void work(){ 61 n=gi(),m=gi(),mc=gi(); 62 for (RG int i=1;i<=n;++i) a[i]=gi(); 63 for (RG int i=1;i<=n;++i) w[i]=gi(); 64 for (RG int i=1;i<=m;++i) c[i]=gi(),mx=max(mx,c[i]); 65 for (RG int i=0;i<=n;++i) 66 for (RG int j=0;j<=101;++j) f[i][j]=-n; 67 f[0][mc]=0; 68 for (RG int i=1;i<=n;++i) 69 for (RG int j=a[i];j<=mc;++j){ 70 f[i][j-a[i]]=max(f[i][j-a[i]],f[i-1][j]+1); 71 RG int t=min(mc,j-a[i]+w[i]); 72 f[i][t]=max(f[i][t],f[i-1][j]); 73 } 74 for (RG int i=0;i<=n;++i) 75 for (RG int j=0;j<=mc;++j) D=max(D,f[i][j]); 76 bfs(); 77 for (RG int k=1;k<=m;++k){ 78 RG int j=1,fg=0,v=inf; 79 for (RG int i=cnt;i;--i){ 80 while (p[j].f+p[i].f<=c[k] && j<i) 81 v=min(v,p[j].d-p[j].f),++j; 82 if (D-c[k]>=v+p[i].d-p[i].f){ fg=1; break; } 83 } 84 printf("%d\n",fg ? 1 : 0); 85 } 86 return; 87 } 88 89 int main(){ 90 File("dalao"); 91 work(); 92 return 0; 93 }
标签:ios 比较 continue n+1 条件 更新 失败 ons 整数
原文地址:http://www.cnblogs.com/wfj2048/p/6785553.html