欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【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了

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

相关标签: NOIP