Codeforces 1199A, B, C, D, E, F

A - City Day

    #include <cstdio>
    int a[100500];
    signed main() {
     
        int n,x,y;
        scanf("%d%d%d",&n,&x,&y);
        for(int i=1;i<=n;i++) {
            scanf("%d",&a[i+10]);
        }
        for(int i=10;i>=1;i--) {
            a[i]=a[i+1]+1;
        }
        for(int i=n+11;i<=n+20;i++) {
            a[i] = a[i-1]+1;
        }
        
        n+=20;
        // for(int i=1;i<=n;i++){
        //     printf("%d ",a[i]);
        // }
        // puts("");
        int l=0,r=0;
        for(int i=11;i<=n;i++) {
            int flag=1;
            for(int j=1;j<=x;j++){
                if(a[i-j]<a[i]){
                    flag=0;
                    break;
                }
            }
            // printf("...");
            if(!flag)continue;
            flag=1;
            for(int j=1;j<=y;j++){
                if(a[i+j]<a[i]){
                    flag=0;
                    break;
                }
            }
            if(!flag)continue;
            printf("%d\n",i-10);
            return 0;
        }
     
     
        return 0;
    }

B - Water Lily

    #include <cstdio>
    #include <cmath>
     
    int main() {
        int a,b;
        scanf("%d%d",&a,&b);
        double x=a,y=b;
        printf("%.12lf\n", (x+y*y/x)*0.5 - x);
    }

C - MP3

    #include <cstdio>
    #include <map>
    using namespace std;
    map<int, int> cnt;
    int main() {
        long long n,I,a;
        scanf("%lld%lld",&n,&I);
        for(int i=1;i<=n;i++){
            scanf("%lld",&a);
            cnt[a]++;
        }
        I = (I*8)/n;
        if(I > 27) {
            printf("0\n");
            return 0;
        }
        long long K = 1ll<<I;
        long long l=0,r=n;
        auto s = cnt.begin(),t = s;
        long long ret = 1ll <<60ll;
        // printf("...%lld\n",K);
        long long dif = 1;
        for(;s!=cnt.end();) {
            while(t!= cnt.end() && dif <= K) {
                r-=t->second;
                t++;
                dif++;
            }
            // printf("%lld %lld\n",l,r);
            ret = min(ret,l+r);
            l+=s->second;
            dif--;
            s++;
        }
        printf("%lld\n",ret);
    }

D - Welfare State

#include <cstdio>
#include <algorithm>
using namespace std;
int sgt[200050<<2], mi[200050<<2], fix[200050<<2],a[200050];
 
 
void pushup(int p) {
    sgt[p] = max(sgt[p<<1], sgt[p<<1|1]);
    mi[p] = min(mi[p<<1],mi[p<<1|1]);
}
void build(int p, int l, int r) {
    fix[p]=-1;
    if(l==r) {
        sgt[p]=mi[p]=a[l];
        return ;
    }
    int m=(l+r)>>1;
    build(p<<1,l,m);
    build(p<<1|1,m+1,r);
    pushup(p);
}
void pushdown(int p) {
    if(fix[p]!=-1) {
        fix[p<<1] = max(fix[p<<1], fix[p]);
        fix[p<<1|1] = max(fix[p<<1|1],fix[p]);
        sgt[p<<1] = max(sgt[p<<1], fix[p]);
        sgt[p<<1|1] = max(sgt[p<<1], fix[p]);
        mi[p<<1] = fix[p];
        mi[p<<1|1] = fix[p];
        fix[p] = -1;
    }
}
 
void tmx(int p, int l, int r, int L, int R, int x) {
    if(mi[p]>=x) {
        return ;
    }
    if(sgt[p] <= x && L <= l && r <= R) {
        sgt[p] = x;
        fix[p] = x;
        mi[p]=x;
        return ;
    }
    pushdown(p);
    int m=(l+r)>>1;
    if(mi[p<<1] < x && L <=m) {
        tmx(p<<1,l,m,L,R,x);
    }
    if(mi[p<<1|1] < x && m < R){
        tmx(p<<1|1,m+1,r,L,R,x);
    }
    pushup(p);
}
void update(int p, int l, int r, int a,int x) {
    if(l==r) {
        mi[p]=sgt[p]=x;
        return ;
    }
    pushdown(p);
    int m = (l+r)>>1;
    if(a<=m) {
        update(p<<1,l,m,a,x);
    } else {
        update(p<<1|1,m+1,r,a,x);
    }
    pushup(p);
}
 
void query(int p, int l, int r) {
    if(l==r) {
        a[l] = sgt[p];
        return ;
    }
    pushdown(p);
    int m=(l+r)>>1;
    query(p<<1,l,m);
    query(p<<1|1,m+1,r);
}
 
int main() {
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    build(1,1,n);
    int q;
    scanf("%d",&q);
    for(int i=1;i<=q;i++){
        int o;
        scanf("%d",&o);
        if(o==1) {
        int p,x;
            scanf("%d",&p);
            scanf("%d",&x);
            update(1,1,n,p,x);
        } else {
            int x;
            
            scanf("%d",&x);
            tmx(1,1,n,1,n, x);
 
        }
    }
    query(1,1,n);
    for(int i=1;i<=n;i++) {
        printf("%d ",a[i]);
    }printf("\n");
}

E - Matching vs Independent Set



    #include <cstring>
    #include <cstdio>
    int vis[400050], rett[400050];
    int main() {
        int T;
        scanf("%d",&T);
        while(T--) {
            
            int n,m;
            scanf("%d%d",&n,&m);
            memset(vis,0,sizeof(int) *(3*n+1));
            int cnt =0;
            for(int i=1;i<=m;i++) {
                int u,v;
                scanf("%d%d",&u,&v);
                if (!vis[u] && !vis[v]) {
                    vis[u] = vis[v] = 1;
                    rett[++cnt] = i;
                }
            }
            if(cnt>=n) {
                puts("Matching");
                for(int i=1;i<=n;i++) {
                    printf("%d ",rett[i]);
                }
                puts("");
            } else {
                puts("IndSet");
                cnt = 1;
                for(int i=1;cnt<=n;i++) {
                    if(!vis[i]) {
                        cnt++;
                        printf("%d ",i);
                    }
                }
                puts("");
            }
        }
    }


F - Rectangle Painting 1

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    char s[55][55];
     int a[55][55],dp[55][55][55][55];
    int main() {
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++) {
            scanf("%s",s[i]+1);
        }
        for(int i=1;i<=n;i++) {
            for(int j=1;j<=n;j++) {
                a[i][j]=a[i][j-1]+a[i-1][j]-a[i-1][j-1]+(s[i][j]=='#');
            }
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++) {
                for(int k=n-i+1;k>=1;k--) {
                    for(int l=n-j+1;l>=1;l--) {
                        // k, l. k+i-1, l+j-1
                        if(a[k+i-1][l+j-1] - a[k-1][l+j-1] - a[k+i-1][l-1] + a[k-1][l-1] == 0) {
                            continue;
                        }
                        auto &ret = dp[k][l][k+i-1][l+j-1];
                        ret = max(i,j);
                        for(int f=1;f<i;f++) {
                           ret = min(ret, dp[k][l][k+f-1][l+j-1]+dp[k+f][l][k+i-1][l+j-1]);
                        }
                        for(int f=1;f<j;f++) {
                            ret= min(ret, dp[k][l][k+i-1][l+f-1]+dp[k][l+f][k+i-1][l+j-1]);
                        }
                    }
                }
            }
        }
        printf("%d\n",dp[1][1][n][n]);
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章