P2827 蚯蚓
P2827 蚯蚓
神奇思维题
其实:
1.暴力 不说了,堆的模板题
2.正解
隐藏了单调性
发现蚯蚓A和蚯蚓B(A>B):
A分成l1与l2
B分成r1与r2 (l1>l2,r1>r2)
那么:l1>r1,l2>r2
所以开三个队列即可
记得:
1.longlong
2.数组开大点
代码:
#include<bits/stdc++.h> using namespace std; const int N=100005; const int M=14000005; typedef long long ll; struct QuEuE{ int h,t; ll q[M]; QuEuE(){h=1,t=0;memset(q,128,sizeof(q));} }q1,q2,q3; int n,m,q,T; ll u,v; ll cnt=0; ll a[M]; ll b[M]; int op=0; ll llmax(ll x,ll y){return x>y?x:y;} ll llmin(ll x,ll y){return x<y?x:y;} bool cmp(ll x,ll y){ if(x>y) return 1; return 0; } int main(){ scanf("%d%d%d%lld%lld%d",&n,&m,&q,&u,&v,&T); for(int i=1;i<=n;i++) scanf("%d",&a[i]); sort(a+1,a+n+1,cmp); for(int i=1;i<=n;i++){ q1.q[++q1.t]=a[i]; } for(int i=1;i<=m;i++){ ll t=llmax(q1.q[q1.h],llmax(q2.q[q2.h],q3.q[q3.h])),opt=t; t+=cnt; cnt+=q; if(q1.q[q1.h]==opt){ q1.h++; ll u1=t*u/v-cnt; ll u2=t-t*u/v-cnt; q2.q[++q2.t]=llmin(u1,u2); q3.q[++q3.t]=llmax(u1,u2); } else if(q2.q[q2.h]==opt){ q2.h++; ll u1=t*u/v-cnt; ll u2=t-t*u/v-cnt; q2.q[++q2.t]=llmin(u1,u2); q3.q[++q3.t]=llmax(u1,u2); } else{ q3.h++; ll u1=t*u/v-cnt; ll u2=t-t*u/v-cnt; q2.q[++q2.t]=llmin(u1,u2); q3.q[++q3.t]=llmax(u1,u2); } if(i%T==0){ printf("%lld ",t); } } printf("\n"); op=0; for(int i=q1.h;i<=q1.t;i++) b[++op]=q1.q[i]; for(int i=q2.h;i<=q2.t;i++) b[++op]=q2.q[i]; for(int i=q3.h;i<=q3.t;i++) b[++op]=q3.q[i]; sort(b+1,b+op+1,cmp); for(int i=1;i<=op;i++){ if(i%T==0){ printf("%lld ",b[i]+cnt); } } printf("\n"); return 0; }