题目链接:https://codeforces.com/contest/1105/problem/E

题意:有 n 个事件,op = 1 表示我可以修改昵称,op = 2 表示一个名为 s_i 的朋友查询我当前的名字。一个朋友是高兴的当且仅当他每次查询我的名字都为 s_i,保证每个朋友至少查询一次我的名字,问最多可以有多少个朋友高兴。

题解:在我两次修改昵称之间,若出现不同的朋友,则他们是互斥的,可以在他们之间连一条边,然后求图的最大独立集,而原图的最大独立集等于补图的最大团,所以求补图的最大团即可。(模板)

 #include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define mst(a,b) memset((a),(b),sizeof(a))
#define mp(a,b) make_pair(a,b)
#define pi acos(-1)
#define pii pair<int,int>
#define pb push_back
#define lowbit(x) ((x)&(-x))
const int INF = 0x3f3f3f3f;
const double eps = 1e-;
const int maxn = 1e5 + ;
const int maxm = 1e6 + ;
const ll mod = 1e9 + ; int n, m, tot = ;
map<string, int>ma, have;
int op[maxn];
string s[maxn]; int mx[], g[][], f[][], ans; int dfs(int cur, int tot) {
if(!cur) {
if(tot > ans)
return ans = tot, ;
return ;
}
for(int i = , j, u, nxt; i < cur; i++) {
if(cur - i + tot <= ans)
return ;
u = f[tot][i], nxt = ;
if(mx[u] + tot <= ans)
return ;
for(j = i + ; j < cur; j++)
if(g[u][f[tot][j]])
f[tot + ][nxt++] = f[tot][j];
if(dfs(nxt, tot + ))
return ;
}
return ;
} int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
scanf("%d%d", &m, &n);
for(int i = ; i <= m; i++) {
scanf("%d", &op[i]);
if(op[i] == ) {
cin >> s[i];
if(ma.find(s[i]) == ma.end())
ma[s[i]] = tot++;
}
}
vector<int>vec;
for(int i = ; i <= m; i++) {
if(op[i] == ) {
have.clear();
for(int i = ; i < vec.size(); i++) {
for(int j = i + ; j < vec.size(); j++) {
g[vec[i]][vec[j]] = g[vec[j]][vec[i]] = ;
}
}
vec.clear();
} else if(have.find(s[i]) == have.end())
vec.pb(ma[s[i]]);
}
for(int i = ; i < vec.size(); i++) {
for(int j = i + ; j < vec.size(); j++) {
g[vec[i]][vec[j]] = g[vec[j]][vec[i]] = ;
}
}
for(int i = ; i < n; i++)
for(int j = ; j < n; j++)
g[i][j] ^= ; int j,k;
for(int i = n - ; ~i; dfs(k, ), mx[i--] = ans)
for(k = , j = i + ; j < n; j++)
if(g[i][j])
f[][k++] = j;
printf("%d\n", ans);
return ;
}

最新文章

  1. SQL中几个常用的排序函数
  2. sql 跨库查询备忘笔记
  3. [教程]怎么用百度云观看和下载&quot;磁力链接&quot;无需下载直接观看.
  4. TensorFlow的开源与Hadoop的开源
  5. VS 解决方案管理器和 编辑窗口同步 联动
  6. [linux系统]--Sed
  7. ExpandableListView二级列表
  8. javascript十六进制数字和ASCII字符之间转换
  9. Node.js 学习(二) 创建第一个应用
  10. erp中三大订单CO、PO、MO各是代表什么?
  11. 《C++ Primer 4th》读书笔记 第7章-函数
  12. ulimit 命令详解
  13. delegate和event
  14. 理解Java虚拟机体系结构(转)
  15. ViewPager和Fragment组合 v4包下的页面切换
  16. Apache下的FileUtils.listFiles方法简单使用技巧
  17. JS(二)
  18. ADO.Net操作数据库的方式
  19. ExtJS Tab里放Grid高度自适应问题,官方Perfect方案。
  20. react如何监听路由url变化

热门文章

  1. ROS中的通信机制
  2. istio网格可视化kiali部署
  3. JWT知识整理
  4. C++ 用 vector 生成三维数组,并计算行、列、高
  5. LaTeX 课本、LaTeX 学习方法、LaTeX 入门(2)
  6. Python30之文件2(文件系统)
  7. Python--拦截接口
  8. Angular 学习笔记 (Angular 9 &amp; ivy)
  9. 使用dockers安装MySQL
  10. javascript Ajax 学习