Codeforcesラウンド584题解

......

、Bは、最初の数秒をカットし、Cは最終的に渡された後に多くの時間を無駄に、問題の悪性腫瘍の詳細です。

D SBが問題となっていますが、まだ長い時間のように、幸い何も深刻なことができました。

E1は、あまりにも前の瞬間、しかし、ピットの詳細は死んで、長い時間になります。

私は非常にE2、E2が常に望んでいた、半数以上が、結果は少し考えをアウト続くだろうと思った感じています。

この点G1でより多くの人々がそれを行うには。しかし、私はああではないでしょう......

保存されません。オフ災害をオフポイント。


A

それはそれの前の数字についてです場合は、列を行に同じ色を染め、または新しい色を開きます。

次のコードは、プログラムが出力される最初の私は思ったので、それはより醜いです。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> PII;
    const int maxn=100010;
    #define MP make_pair
    #define PB push_back
    #define lson o<<1,l,mid
    #define rson o<<1|1,mid+1,r
    #define FOR(i,a,b) for(int i=(a);i<=(b);i++)
    #define ROF(i,a,b) for(int i=(a);i>=(b);i--)
    #define MEM(x,v) memset(x,v,sizeof(x))
    inline ll read(){
        char ch=getchar();ll x=0,f=0;
        while(ch<'0' || ch>'9') f|=ch=='-',ch=getchar();
        while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
        return f?-x:x;
    }
    struct hhh{
        int x,id;
        bool operator<(const hhh &h)const{return x<h.x;}
    }h[maxn];
    int n,cnt;
    int main(){
        n=read();
        FOR(i,1,n) h[i].x=read(),h[i].id=i;
        sort(h+1,h+n+1);
        FOR(i,1,n){
            int pos=0;
            FOR(j,1,i-1) if(h[i].x%h[j].x==0) pos=j;
            if(!pos) cnt++;
        }
        printf("%d\n",cnt);
    }

B

明らかに、周期的、直接的なシミュレーションがあるでしょう。期間は\(125 \)が、限り、Tはリストに載っていないよう。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> PII;
    const int maxn=100010;
    #define MP make_pair
    #define PB push_back
    #define lson o<<1,l,mid
    #define rson o<<1|1,mid+1,r
    #define FOR(i,a,b) for(int i=(a);i<=(b);i++)
    #define ROF(i,a,b) for(int i=(a);i>=(b);i--)
    #define MEM(x,v) memset(x,v,sizeof(x))
    inline ll read(){
        char ch=getchar();ll x=0,f=0;
        while(ch<'0' || ch>'9') f|=ch=='-',ch=getchar();
        while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
        return f?-x:x;
    }
    int n,a[maxn],b[maxn],ans;
    char s[maxn];
    int calc(){
        int sum=0;
        FOR(i,1,n) if(s[i]=='1') sum++;
        return sum;
    }
    int main(){
        n=read();
        scanf("%s",s+1);
        FOR(i,1,n) a[i]=read(),b[i]=read();
        FOR(i,1,100000){
            ans=max(ans,calc());
            FOR(j,1,n) if(i>=b[j] && (i-b[j])%a[j]==0) s[j]^=1;
        }
        printf("%d\n",ans);
    }

C

従事する方法を実行する方法のように言うことは何もありません。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int maxn=200020;
#define MP make_pair
#define PB push_back
#define lson o<<1,l,mid
#define rson o<<1|1,mid+1,r
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline ll read(){
    char ch=getchar();ll x=0,f=0;
    while(ch<'0' || ch>'9') f|=ch=='-',ch=getchar();
    while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
    return f?-x:x;
}
struct item{
    int x,id;
    bool operator<(const item &i)const{
        if(x!=i.x) return x<i.x;
        return id<i.id;
    }
}it[maxn];
int t,n,ans[maxn],back[maxn];
vector<int> hhh[10];
bool in[maxn];
char s[maxn];
int main(){
    t=read();
    while(t--){
        n=read();
        scanf("%s",s+1);
        bool flag=true;
        FOR(i,0,9) hhh[i].clear();
        FOR(i,1,n) hhh[s[i]-'0'].push_back(i);
        int pos=-1,lst=-1;
        FOR(i,0,9) if(hhh[i].size()){
            back[i]=hhh[i].back();
            FOR(j,0,(int)hhh[i].size()-1){
                if(pos!=-1) ans[hhh[i][j]]=2;
                else if(lst!=-1 && hhh[i][j]<hhh[lst].back()) ans[hhh[i][j]]=2,back[i]=hhh[i][j];
                else ans[hhh[i][j]]=1;
            }
            if(lst!=-1){
                if(pos==-1){
                    if(hhh[i].front()<back[lst]) pos=i;
                }
                else{
                    if(hhh[i].front()<back[lst]){puts("-");flag=false;break;}
                }
            }
            lst=i;
        }
        if(flag){
            FOR(i,1,n) printf("%d",ans[i]);
            puts("");
        }
    }
}

D

誰も\(Xの\)\(Y軸\)があってもエッジ。

上記の少なくとも一つを満たすことができない、リングを考えます。ライン上で、最終的な表面に詰め、この男を置くための提案。

それは木であれば、それはすべて満足させることができます。プログラム構造は難しいことではありません。

次に、スパニングツリー、のは、木の人々の側を満たしてみましょう、非人の木の側はライン上の(最終面に詰め)満足していない取得、カジュアル、各ブロックユニコム考えます。もちろん最高。

実際にはエッジのみとポイントの数をカウントする必要があります。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> PII;
    const int maxn=200020;
    #define MP make_pair
    #define PB push_back
    #define lson o<<1,l,mid
    #define rson o<<1|1,mid+1,r
    #define FOR(i,a,b) for(int i=(a);i<=(b);i++)
    #define ROF(i,a,b) for(int i=(a);i>=(b);i--)
    #define MEM(x,v) memset(x,v,sizeof(x))
    inline ll read(){
        char ch=getchar();ll x=0,f=0;
        while(ch<'0' || ch>'9') f|=ch=='-',ch=getchar();
        while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
        return f?-x:x;
    }
    int n,k,ans,el,head[maxn],to[maxn],nxt[maxn];
    bool vis[maxn];
    map<PII,bool> vise;
    inline void add(int u,int v){
        to[++el]=v;nxt[el]=head[u];head[u]=el;
    }
    void dfs(int u,int f){
        vis[u]=true;
        for(int i=head[u];i;i=nxt[i]){
            int v=to[i];
            if(v==f) continue;
            if(vis[v]){
                ans++;continue;
            }
            dfs(v,u);
        }
    }
    int main(){
        n=read();k=read();
        FOR(i,1,k){
            int x=read(),y=read();
            if(x>y) swap(x,y);
            if(vise[MP(x,y)]) ans+=2;
            else{
                vise[MP(x,y)]=true;
                add(x,y);add(y,x);
            }
        }
        FOR(i,1,n) if(!vis[i]) dfs(i,0);
        printf("%d\n",ans/2);
    }

E

サイクルシフトカラムの後、数から選択されたそれぞれの行は、これらの最大数を見つけて:変換は、何かが必要です。

簡単DP:\(F [I] [J] \)前方を表す\(Iは\)カラム、\(J \)これらの行番号を選択したが。

時間複雑\(O(2M + 2 ^ NN ^ ^ NM。3)\) E1によります。

E2、ソートする各列の最大値によって発見のための\(M> N \) 最大の考慮すべき唯一の必要\(N- \)カラム。

証拠は、この検討\(N \)を確実以上のカラムに最適解\(N \)カラム最大和(これら\(N \)列に配置最大によるカラム各行)は間違いなく最適解です。比例し、1代わるであろう\(N \)の列の最大値の後にかかわらず、サイクルがないこの列の列上の他の選択された番号の数としてこのコラム、選挙をシフトする方法の、小さいコラムです。

時間複雑\(O(^ ^ 2。3 NN + NN ^。3)\)

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> PII;
    const int maxn=100010;
    #define MP make_pair
    #define PB push_back
    #define lson o<<1,l,mid
    #define rson o<<1|1,mid+1,r
    #define FOR(i,a,b) for(int i=(a);i<=(b);i++)
    #define ROF(i,a,b) for(int i=(a);i>=(b);i--)
    #define MEM(x,v) memset(x,v,sizeof(x))
    inline ll read(){
        char ch=getchar();ll x=0,f=0;
        while(ch<'0' || ch>'9') f|=ch=='-',ch=getchar();
        while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
        return f?-x:x;
    }
    int t,n,m,a[22][22],b[22][2222],mx[2222],p[2222],sum[22][4444],f[22][4444];
    bool cmp(int x,int y){return mx[x]>mx[y];}
    int main(){
        t=read();
        while(t--){
            n=read();m=read();
            FOR(i,0,n-1) FOR(j,0,m-1) b[i][j]=read();
            FOR(i,0,m-1){
                mx[i]=0;
                FOR(j,0,n-1) mx[i]=max(mx[i],b[j][i]);
            }
            FOR(i,0,m-1) p[i]=i;
            sort(p,p+m,cmp);
            FOR(i,0,min(n,m)-1) FOR(j,0,n-1) a[j][i]=b[j][p[i]];
            FOR(i,0,min(n,m)-1) FOR(S,0,(1<<n)-1){
                sum[i][S]=0;
                FOR(j,0,n-1){
                    int s=0;
                    FOR(k,0,n-1) if((S>>k)&1) s+=a[(j+k)%n][i];
                    sum[i][S]=max(sum[i][S],s);
                }
            }
            FOR(S,0,(1<<n)-1) f[0][S]=sum[0][S];
            FOR(i,1,min(n,m)-1) FOR(S,0,(1<<n)-1){
                f[i][S]=f[i-1][S];
                for(int S0=S;S0;S0=(S0-1)&S) f[i][S]=max(f[i][S],f[i-1][S^S0]+sum[i][S0]);
            }
            printf("%d\n",f[min(n,m)-1][(1<<n)-1]);
        }
    }

G1

Sbの伝説が問題でしょうか?オーバー......

最初のいくつかのブロック、正確に一つのブロック内の各色と、可能な限りブロックに分割されます。どうやら1つのプログラムだけでは貪欲ことと行うことができます。それは、互いに独立して、このようなブロック内の色、及び各ブロックになるであろう。ブロックでは、表示される色の数が最も多いを除き、他はその色になる必要があります。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> PII;
    const int maxn=222222;
    #define MP make_pair
    #define PB push_back
    #define lson o<<1,l,mid
    #define rson o<<1|1,mid+1,r
    #define FOR(i,a,b) for(int i=(a);i<=(b);i++)
    #define ROF(i,a,b) for(int i=(a);i>=(b);i--)
    #define MEM(x,v) memset(x,v,sizeof(x))
    inline ll read(){
        char ch=getchar();ll x=0,f=0;
        while(ch<'0' || ch>'9') f|=ch=='-',ch=getchar();
        while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
        return f?-x:x;
    }
    int n,q,a[maxn],mn[maxn],l,r,tmp[maxn],tl,cnt[maxn],ans;
    int calc(){
        tl=0;
        FOR(i,l,r) if(++cnt[a[i]]==1) tmp[++tl]=a[i];
        FOR(i,1,tl) tmp[i]=cnt[tmp[i]];
        sort(tmp+1,tmp+tl+1);
        int s=0;
        FOR(i,1,tl-1) s+=tmp[i];
        FOR(i,l,r) cnt[a[i]]--;
        return s;
    }
    int main(){
        n=read();q=read();
        FOR(i,1,n){
            a[i]=read();
            if(!mn[a[i]]) mn[a[i]]=i;
        }
        int curmn=1e9;
        r=n;
        ROF(i,n,1){
            curmn=min(curmn,mn[a[i]]);
            if(i==curmn){
                curmn=1e9;
                l=i;
                ans+=calc();
                r=i-1;
            }
        }
        printf("%d\n",ans);
        while(q--) puts("PB AK ZROI");
    }

残り、クッション。

おすすめ

転載: www.cnblogs.com/1000Suns/p/11537177.html