【NOIP2016】蚯蚓

题面链接

算法:

          我们将蚯蚓长度分成三个数组存储,原先就有、切掉后长度为⌊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了

所以。。。。大佬们在看的时候。。。。查查错呗。。。。

猜你喜欢

转载自blog.csdn.net/Bill_Benation/article/details/83384691