羅区P2827ミミズ

トピックリンク

まず、我々は単純なアプローチヒープを持っています

ヒープのミミズの長さを守り、ほとんどを取り出し、その後、質問の意味にカットした後、戻って山の中へ。

トラブルのビットの長さを増加させる、我々は、ミミズ+の数がヒープに等しい長さを追加し、各時間分割数をqを差し引くことによって得られるように、怠惰な追加グローバルタグを維持考えます。

このような複雑さは、書き込みにある(\ O(mlog_2 N)\ ) ACは、唯一85ptsすることはできませんが、本当に速く書くこと

[コード]

#include <bits/stdc++.h>
using namespace std;

int read(){
    int x=0; char c; int flag=1;
    for(c=getchar();!isdigit(c);c=getchar()) if(c=='-') flag=-1;
    for(;isdigit(c);c=getchar()) x=((x+(x<<2))<<1)+(c^48);
    return x*flag;
}

int add;
priority_queue<int> Q;
int n,m,q,u,v,t;

signed main() {
    n=read(),m=read(),q=read(),u=read(),v=read(),t=read();
    double p=(double)u/v;
    for(int i=1;i<=n;i++) Q.push(read());
    add=0;
    for(int i=1;i<=m;i++){
        int val=Q.top()+add; Q.pop();
        if(i%t==0) printf("%d ",val);
        int v1=floor(val*p),v2=val-v1;
        Q.push(v1-q-add); Q.push(v2-q-add);
        add+=q;
    }
    puts("");
    for(int i=1;i<=n+m;i++){
        int val=Q.top()+add; Q.pop();
        if(i%t==0) printf("%d ",val);
    }
    puts("");
    return 0;
}

100pts

我々は3つのキュー、キュー1はミミズの始まりを表し維持、キュー2は、小さなキューカットアウト3匹の表現ミミズ、大ミミズを切り出し表し

プロ配列のために、降順にソートし、容易に得られる最初の2つの部分はカットワームは、2匹のミミズの後縁部よりも大きかった場合、我々は、このように単調減少キュー要素を見つけます

グローバルアドオンの同じメンテナンス、3つのキューからそれぞれの最大値を探します

最後に3つのキュー、容易に達成をマージします。

[コード]

#include <bits/stdc++.h>
using namespace std;
#define int long long

int read(){
    int x=0; char c; int flag=1;
    for(c=getchar();!isdigit(c);c=getchar()) if(c=='-') flag=-1;
    for(;isdigit(c);c=getchar()) x=((x+(x<<2))<<1)+(c^48);
    return x*flag;
}

int add;
int n,m,q,u,v,t;
double p;
int a[100010];
queue<int> q1,q2,q3;

int get(){
    int val=-(1<<30);
    if(!q1.empty()) val=max(val,q1.front()+add);
    if(!q2.empty()) val=max(val,q2.front()+add);
    if(!q3.empty()) val=max(val,q3.front()+add);
    if(!q1.empty()&&val==q1.front()+add) q1.pop();
    else
    if(!q2.empty()&&val==q2.front()+add) q2.pop();
    else
    if(!q3.empty()&&val==q3.front()+add) q3.pop();
    return val;
}

signed main() {
    n=read(),m=read(),q=read(),u=read(),v=read(),t=read();
    p=(double)u/v;
    
    for(int i=1;i<=n;i++) a[i]=read();
    sort(a+1,a+n+1);
    
    for(int i=n;i>=1;i--) q1.push(a[i]);
    
    add=0;
    
    for(int i=1;i<=m;i++){
        int val=get();
        if(i%t==0) printf("%lld ",val);
        int v1=floor(val*p),v2=val-v1;
        if(v1<v2) swap(v1,v2);
        add+=q;
        q2.push(v1-add); q3.push(v2-add);
    }
    puts("");
    
    for(int i=1;i<=n+m;i++){
        int val=get();
        if(i%t==0) printf("%lld ",val);
    }
    puts("");
    return 0;
}

おすすめ

転載: www.cnblogs.com/zzhzzh123/p/12076978.html