【NOIP2016】蚯蚓
程序员文章站
2022-03-15 08:33:33
...
算法:
我们将蚯蚓长度分成三个数组存储,原先就有、切掉后长度为⌊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了
所以。。。。大佬们在看的时候。。。。查查错呗。。。。
上一篇: 爆逗,家里的笑事儿很精彩!