【NOIP2016】蚯蚓
阿新 • • 發佈:2018-10-31
演算法:
我們將蚯蚓長度分成三個陣列儲存,原先就有、切掉後長度為⌊px⌋、 切掉後長度為x −⌊px⌋。
在記錄下每一個蚯蚓出現時間(原先就有的都是0時出現),和每一個數組的第一個和最後一隻蚯蚓所在座標。
在完成m次騷操作後,我們用一個vector將所有還活著的蚯蚓整合起來,排個序,愉快輸出即可。
Code:
#include<bits/stdc++.h> #define rep(i,j,k) for(register int i=j;i<=k;i++) using namespace std; template<typename T> void chkmax(T &x,T y){x=x>y?x:y;} template<typename T> void read(T &num){ char c=getchar();T f=1;num=0; while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){num=(num<<3)+(num<<1)+(c^48);c=getchar();} num*=f; } template<typename T> void qwq(T x){ if(x>9)qwq(x/10); putchar(x%10+'0'); } template<typename T> void write(T x){ if(x<0){x=-x;putchar('-');} qwq(x); } int qy1[100010];int qy2[7000010];int qy3[7000010]; int tim[2][7000010]; int len[4][3]; vector<int>ans; inline bool cmp(int a,int b){ return a>b?1:0; } inline bool chk(){ if(len[1][1]<=len[1][2]||len[2][1]<=len[2][2]||len[3][1]<=len[3][2])return true; return false; } int main(){ int n,m,q,u,v,t;read(n);read(m);read(q);read(u);read(v);read(t); rep(i,1,n){read(qy1[i]);} sort(qy1+1,qy1+n+1,cmp); len[1][1]=1;len[1][2]=n;len[2][1]=len[3][1]=1;len[2][2]=len[3][2]=0; rep(i,1,m){ int nop1,nop2; int temp1=qy1[len[1][1]];int temp2=qy2[len[2][1]];int temp3=qy3[len[3][1]]; temp1+=(temp1!=0)*(i-1)*q;temp2+=(temp2!=0)*(i-tim[0][len[2][1]]-1)*q;temp3+=(temp3!=0)*(i-tim[1][len[3][1]]-1)*q; if(temp1>=temp2&&temp1>=temp3&&len[1][1]<=len[1][2]){ nop1=1ll*temp1*u/v;nop2=temp1-nop1; qy2[++len[2][2]]=nop1;qy3[++len[3][2]]=nop2; tim[0][len[2][2]]=tim[1][len[3][2]]=i; len[1][1]++; }else if(temp2>=temp1&&temp2>=temp3&&len[2][1]<=len[2][2]){ nop1=1ll*temp2*u/v;nop2=temp2-nop1; qy2[++len[2][2]]=nop1;qy3[++len[3][2]]=nop2; tim[0][len[2][2]]=tim[1][len[3][2]]=i; len[2][1]++; }else if(temp3>=temp1&&temp3>=temp2&&len[3][1]<=len[3][2]){ nop1=1ll*temp3*u/v;nop2=temp3-nop1; qy2[++len[2][2]]=nop1;qy3[++len[3][2]]=nop2; tim[0][len[2][2]]=tim[1][len[3][2]]=i; len[3][1]++; } chkmax(temp1,temp2);chkmax(temp1,temp3); if(i%t==0){ write(temp1); if(i+t<=m)putchar(' '); } } putchar('\n'); while(chk()){ int temp1=qy1[len[1][1]]+m*q*(len[1][1]<=len[1][2]); int temp2=qy2[len[2][1]]+(m-tim[0][len[2][1]])*q*(len[2][1]<=len[2][2]); int temp3=qy3[len[3][1]]+(m-tim[1][len[3][1]])*q*(len[3][1]<=len[3][2]); if(temp1>=temp2&&temp1>=temp3){ ans.push_back(temp1);len[1][1]++; }else if(temp2>=temp1&&temp2>=temp3){ ans.push_back(temp2);len[2][1]++; }else if(temp3>=temp1&&temp3>=temp2){ ans.push_back(temp3);len[3][1]++; } } for(int i=t;i<=ans.size();i+=t){ write(ans[i-1]);putchar((i+t>ans.size())?'\n':' '); } return 0; }
PS:本題在洛谷上綠(你們懂的)了,但在UOJ上被:
Extra Test Failed : Wrong Answer on 6了
所以。。。。大佬們在看的時候。。。。查查錯唄。。。。