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; }
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); } }