vijosP1195“非常男女”计划

vijosP1195“非常男女”计划

链接:https://vijos.org/p/1195

【思路】

   人数差。

   人数差相等的两点之间的区间一定有男女人数相等。

   计目前为止到i的1为sum1,0为sum0,则人数差为t,用l [t] 数组记录差值t出现的最左点,比较得ans。

   需要注意N是偏移量,化负为正,l[0+N]初始为0且防止被覆盖。

【代码】

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 
 5 const int maxn = 200000+10;
 6 const int N=100000+2;
 7 int l[maxn],r;
 8 int n;
 9 
10 inline int read_int() {
11     char c=getchar();
12     while(!isdigit(c)) c=getchar();
13     int x=0;
14     while(isdigit(c)) {
15         x=x*10+c-'0';
16         c=getchar();
17     }
18     return x;
19 }
20 int main() {
21     n=read_int();
22     int ans=0;
23     int sum0=0,sum1=0;
24     l[0+N]=0;
25     for(int i=1;i<=n;i++) {
26         int x=read_int(); 
27         if(x) sum1++; else sum0++;
28         int t=sum1-sum0+N;
29         if((t-N)&&!l[t]) l[t]=i;
30         ans=max(ans,i-l[t]);
31     }
32     cout<<ans;
33     return 0;
34 }
原文地址:https://www.cnblogs.com/lidaxin/p/4903799.html