[USACO07MAR]黄金阵容均衡【前缀和】
难得了啊,有这种训练思维的好题。
很容易想到整体状态的前缀和,此时为了避免$O(n^2)$的枚举和之前的哪一个相同,我们一直保持1这种属性不变,一旦哪一天给1加了,就给所有的属性减一,这样在某一段整体增量相同的时间里面,所有属性保持的状态相同,用Hash或者vector存状态,使用map来查找。
CODE:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <vector>
using namespace std;
map<vector<int>,int> mp;
int n,m,x;
int ans;
int main()
{
scanf("%d%d",&n,&m);
vector<int> vis(m);
mp[vis]=0;
for(int t=1;t<=n;t++)
{
scanf("%d",&x);
for(int i=0;i<m;i++)
if(x&(1<<i))
vis[i]++;
if(x&1) for(int i=0;i<m;i++) vis[i]--;
if(mp.count(vis)) ans=max(ans,t-mp[vis]);
else mp[vis]=t;
}
printf("%d",ans);
return 0;
}

浙公网安备 33010602011771号