Codeforces Round #533 (Div. 2) (2)

每次高兴才算高兴的话
其实就是对于一段连续的查询操作统计答案时最多只能统计一次
所以对于一段连续的查询操作中任意两点连边所形成的图的 补集的最大团就是答案
之后利用最大团的随机算法就好
至于随机算法证明我就只能告诉你应该和概率相关,具体不会证明

#include<bits/stdc++.h> using namespace std; int n,m,k,a[50],b[50],tot; bool vis[50][50]; string ss; map<string,int>mp; bitset<50>s,ans; void work1() { for (int i=1; i<=a[0]; i++) { for (int j=i+1; j<=a[0]; j++) vis[a[i]][a[j]]=vis[a[j]][a[i]]=false; } a[0]=0; } void work2() { if (!mp.count(ss)) mp[ss]=++tot; a[++a[0]]=mp[ss]; } int main() { scanf("%d%d",&n,&m); memset(vis,true,sizeof(vis)); for (int i=1; i<=n; i++) { int type; scanf("%d",&type); if (type==1) work1(); else cin>>ss,work2(); } work1(); int T=5e4; for (int i=1; i<=m; i++) b[i]=i; while (T--) { random_shuffle(b+1,b+m+1); for (int i=1; i<=m; i++) s[i]=1; for (int i=1; i<=m; i++) { if (s[b[i]]==1) { for (int j=i+1; j<=m; j++) { if (!vis[b[i]][b[j]]) s[b[j]]=0; } } } if (s.count()>ans.count()) ans=s; } cout<<ans.count()<<endl; }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwxgsz.html