Noip2016 day2t3
蚯蚓
蚯蚓在noip好像是个神宠。这次是被切了,开三个队列,q[3][1000010],q[0]代表没有被切的,q[1]表示切的p部分,q[2]表示(1-p)部分,q[1],q[2]能够保证单调不增,q[0]从大到小排序,每次比队首即可,这里用懒惰标记的思想,用add累加,放回去的时候,再减去。
#include<bits/stdc++.h> using namespace std; int n,m,len,u,v,t,add,q[3][10000010],head[3],tail[3]; void in(int &x) { char c=getchar();x=0; while(c<'0'||c>'9')c=getchar(); while(c<='9'&&c>='0')x=x*10+c-'0',c=getchar(); } void out(int x) { if(x>9)out(x/10); putchar(x%10+'0'); } bool cmp(int x,int y) { return x>y; } int main() { memset(q,-0x7f,sizeof(q)); in(n),in(m),in(len),in(u),in(v),in(t); long long x; int xx; for(int i=1;i<=n;i++) { in(xx); q[0][i]=xx; } sort(q[0]+1,q[0]+n+1,cmp); head[0]=head[1]=head[2]=1; tail[0]=n; long long Max; long long l,r; for(int i=1;i<=m;i++) { Max=q[0][head[0]]>=q[1][head[1]]?0:1; Max=q[Max][head[Max]]>=q[2][head[2]]?Max:2; x=q[Max][head[Max]++]+add; if(i%t==0) out(x),putchar(' '); l=x*u/v; r=x-l; q[1][++tail[1]]=l-add-len; q[2][++tail[2]]=r-add-len; add+=len; } putchar(' '); for(int i=1;i<=m+n;i++) { Max=q[0][head[0]]>=q[1][head[1]]?0:1; Max=q[Max][head[Max]]>=q[2][head[2]]?Max:2; x=q[Max][head[Max]++]; if(i%t==0) out(x+add),putchar(' '); } return 0; }