P2827 蚯蚓

P2827 蚯蚓

神奇思维题

其实:

1.暴力 不说了,堆的模板题

2.正解

隐藏了单调性

发现蚯蚓A和蚯蚓B(A>B):

A分成l1与l2

B分成r1与r2 (l1>l2,r1>r2)

那么:l1>r1,l2>r2

所以开三个队列即可

记得:

1.longlong

2.数组开大点

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=100005;
const int M=14000005;
typedef long long ll;
struct QuEuE{
    int h,t;
    ll q[M];
    QuEuE(){h=1,t=0;memset(q,128,sizeof(q));}
}q1,q2,q3;
int n,m,q,T;
ll u,v;
ll cnt=0;
ll a[M];
ll b[M];
int op=0;
ll llmax(ll x,ll y){return x>y?x:y;}
ll llmin(ll x,ll y){return x<y?x:y;}
bool cmp(ll x,ll y){
    if(x>y) return 1;
    return 0;
}
int main(){
    scanf("%d%d%d%lld%lld%d",&n,&m,&q,&u,&v,&T);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    sort(a+1,a+n+1,cmp);
    for(int i=1;i<=n;i++){
        q1.q[++q1.t]=a[i];
    }
    for(int i=1;i<=m;i++){
        
        ll t=llmax(q1.q[q1.h],llmax(q2.q[q2.h],q3.q[q3.h])),opt=t;
        t+=cnt;
        cnt+=q;
        if(q1.q[q1.h]==opt){
            q1.h++;
            ll u1=t*u/v-cnt;
            ll u2=t-t*u/v-cnt;
            q2.q[++q2.t]=llmin(u1,u2);
            q3.q[++q3.t]=llmax(u1,u2);
        }
        else if(q2.q[q2.h]==opt){
            q2.h++;
            ll u1=t*u/v-cnt;
            ll u2=t-t*u/v-cnt;
            q2.q[++q2.t]=llmin(u1,u2);
            q3.q[++q3.t]=llmax(u1,u2);
        }
        else{
            q3.h++;
            ll u1=t*u/v-cnt;
            ll u2=t-t*u/v-cnt;
            q2.q[++q2.t]=llmin(u1,u2);
            q3.q[++q3.t]=llmax(u1,u2);
        }
        
        if(i%T==0){
            printf("%lld ",t);
        }
    }
    printf("\n");
    op=0;
    for(int i=q1.h;i<=q1.t;i++) b[++op]=q1.q[i];
    for(int i=q2.h;i<=q2.t;i++) b[++op]=q2.q[i];
    for(int i=q3.h;i<=q3.t;i++) b[++op]=q3.q[i];
    sort(b+1,b+op+1,cmp);
    for(int i=1;i<=op;i++){
        if(i%T==0){
            printf("%lld ",b[i]+cnt);
        }
    }
    printf("\n");
    return 0;
}

 

posted @ 2019-11-11 21:24  QYJ060604  阅读(101)  评论(0编辑  收藏  举报