2019牛客多校训练营第三场补题

B题:Crazy Binary String

把0看成-1,前缀和,pos[ 0+n ] = 0

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

const int maxn = 1e5+3;
int a[maxn]; 
int pos[maxn<<1];
string s;

int main(){
    ios::sync_with_stdio(false);
    int n;
    cin>>n>>s;
    for(int i=0; i<n; i++){
        if(s[i]=='0') a[i] = a[i-1] -1;
        else a[i] = a[i-1] + 1;
    }
    for(int i=0; i<=2*n; i++){
        pos[i] = -1;
    }
    pos[ 0+n ] = 0;  //注意这个不是简单的0 而是 0+n
    int ans=0;
    for(int i=0; i<n; i++){
        if(pos[ n+a[i] ]!=-1) 
            ans = max(ans, i-pos[ n+a[i] ]);
        else{
            pos[ n+a[i] ] = i;
        }
    }
    cout<<ans<<" ";
    int zero=0;
    for(int i=0; i<n; i++){
        zero += s[i]=='0'; 
    }
    cout<<( min(zero,n-zero)<<1 )<<endl;
}
View Code

H题: Magic Line

排序 ,找 n/2点 和 n/2+1点

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=20000;
const int M=900000009;
struct Point{
    int x,y;
}po[maxn];
bool cmp(Point a,Point b){
    if(a.x!=b.x) return a.x<b.x;
    else return a.y<b.y;
}
int main(){
    int T,n;
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d%d",&po[i].x,&po[i].y);
        }
        sort(po+1,po+1+n,cmp);
        if(po[n/2].x!=po[n/2+1].x) printf("%d %d %d %d\n",po[n/2].x,M,po[n/2+1],-M);
        else printf("%d %d %d %d\n",po[n/2].x-1,po[n/2+1].y+M,po[n/2].x+1,po[n/2].y-M);
    }
}
View Code

猜你喜欢

转载自www.cnblogs.com/-Zzz-/p/11525297.html