【CF】Codeforces Round #545 (Div. 2)

菜是原罪(暂待填坑)

A

水题
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n;
int a[100005],lx[100005];
int ans;
int main() {
    scanf("%d",&n);
    for(int i=1;i<=n;i++) {
        scanf("%d",&a[i]);
        if(a[i]==a[i-1]) lx[i]=lx[i-1]+1;
        else lx[i] = 1;
        int o = i-lx[i];
        if(a[o]!=a[i]&&lx[o]>=lx[i]) ans = max(lx[i]*2,ans);
    }
    printf("%d",ans);
}

B

构造
#include<stdio.h>
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>

using namespace std;

int ac[5005];
char sA[5005],sB[5005];
int n,le;
int A,B,C,D;
int a,b,c,d;
bool mk[5005];
int main() {
    scanf("%d%s%s",&n,&sA[1],&sB[1]);
    for(int i=1;i<=n;i++) {
        if(sA[i]=='1'&&sB[i]=='0') a++,ac[i]=1;
        if(sA[i]=='0'&&sB[i]=='1') b++,ac[i]=2;
        if(sA[i]=='1'&&sB[i]=='1') c++,ac[i]=3;
        if(sA[i]=='0'&&sB[i]=='0') d++,ac[i]=4;
    }
    A = -1; le = (n>>1);
    for(int i=0;i<=le;i++) {
        for(int j=0;j<=i&&j<=a;j++) {
            int a1 = j;
            int c1 = i-j;
            int b1 = b-(i-(c-c1));
            int d1 = le-a1-b1-c1;
            if(a1<0||c1<0||b1<0||d1<0||a1>a||b1>b||c1>c||d1>d) continue;
            A = a1; B = b1; C = c1; D = d1;
            break;
        }
    }
    if(A==-1) {
        puts("-1"); return 0;
    }
    for(int i=1;i<=n;i++) {
        if(ac[i]==1&&A) {
            A--; mk[i] = 1;
        }
        if(ac[i]==2&&B) {
            B--; mk[i] = 1;
        }
        if(ac[i]==3&&C) {
            C--; mk[i] = 1;
        }
        if(ac[i]==4&&D) {
            D--; mk[i] = 1;
        }
        if(mk[i]) printf("%d ",i);
    }
}

C

直接sort之后,对于一个交叉路口答案就是max(行中比自己小的,列中比自己小的) + max(行中比自己大的,列中比自己大的)+1
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 5e4+5;
int n,m;
int a[1005][1005];
int sta[1005];
int miwh[1005][1005],mxwh[1005][1005];
int miwl[1005][1005],mxwl[1005][1005];
int main() {
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) {
        for(int j=1;j<=m;j++)
            scanf("%d",&a[i][j]);
    }
    int tp = 0;
    for(int i=1;i<=n;i++) {
        tp = 0;
        for(int j=1;j<=m;j++) sta[++tp] = a[i][j];
        sort(sta+1,sta+1+tp);
        tp = unique(sta+1,sta+1+tp)-sta-1;
        for(int j=1;j<=m;j++) {
            miwh[i][j] = lower_bound(sta+1,sta+1+tp,a[i][j])-sta;
            mxwh[i][j] = tp - miwh[i][j];
        }
    }
    for(int i=1;i<=m;i++) {
        tp = 0;
        for(int j=1;j<=n;j++) sta[++tp] = a[j][i];
        sort(sta+1,sta+1+tp);
        tp = unique(sta+1,sta+1+tp)-sta-1;
        for(int j=1;j<=n;j++) {
            miwl[j][i] = lower_bound(sta+1,sta+1+tp,a[j][i])-sta;
            mxwl[j][i] = tp - miwl[j][i];
        }
    }
    for(int i=1;i<=n;i++) {
        for(int j=1;j<=m;j++) {
            printf("%d ",max(miwh[i][j],miwl[i][j]) + max(mxwh[i][j],mxwl[i][j]));
        }
        puts("");
    }
}

D

KMP
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 5e5+5;
char s[maxn],t[maxn];
int fail[maxn];
int c1,c0,len1,len2;
int main() {
    int j = 0;
    scanf("%s%s",&s[1],&t[1]);
    len1 = strlen(s+1); len2 = strlen(t+1);
    for(int i=1;i<=len1;i++) {
        if(s[i]=='0') c0++;
        else c1++;
    }
    for(int i=2;i<=len2;i++) {
        while(j&&t[j+1]!=t[i]) j = fail[j];
        if(t[j+1]==t[i]) j++;
        fail[i] = j;
    }
    j = 0;
    for(int i=1;i<=len1;i++) {
        if(t[j+1]=='0') {
            if(c0) printf("%c",t[j+1]),c0--;
            else break;
        } else {
            if(c1) printf("%c",t[j+1]),c1--;
            else break;
        }
        j++; if(j==len2) j = fail[len2];
    }
    while(c0) putchar('0'),c0--;
    while(c1) putchar('1'),c1--;
}
posted @ 2019-03-08 20:04  Newuser233  阅读(3)  评论(0编辑  收藏  举报