CF1105E Helping Hiasat
题目地址:CF1105E Helping Hiasat
首先将问题转化成图论:对每个人建立一个点,将同一次修改后的所有人代表的点两两连一条边,那么最终所求的就是这个图的最大独立集
我们知道最大独立集是NPC问题,只能暴力搜
裸暴力的时间复杂度为 \(O(2^m)\) ,由于 \(m\leq 40\) ,无法承受
我们知道最大独立集=补图最小团,考虑记忆化搜索,时间复杂度降为 \(O(\sqrt {2^m})\)
我写的代码广泛应用了STL,包括 \(vector\),\(set\),\(map\),\(string\),因此常数较大,时间复杂度也应该加上几个 \(log\) ,但巧妙应用可以降低编程复杂度
代码:
#include <bits/stdc++.h>
#define ll long long
#define si set<int>::iterator
using namespace std;
int n, m, num;
ll e[46];
vector<set<int> > v;
map<string, int> mp;
map<ll, int> f;
int dfs(ll x) {
if (f.find(x) != f.end()) return f[x];
int t = 0;
while (!((x >> t) & 1)) ++t;
int a = dfs(x ^ (1ll << t)), b = dfs(x & e[t]);
return f[x] = max(a, b + 1);
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
int o;
scanf("%d", &o);;
if (o == 1) {
set<int> st;
v.push_back(st);
} else {
string s;
cin >> s;
if (mp.find(s) == mp.end()) mp[s] = num++;
v.back().insert(mp[s]);
}
}
fill(e, e + m, (1ll << m) - 1);
for (unsigned int i = 0; i < v.size(); i++)
for (si i1 = v[i].begin(); i1 != v[i].end(); i1++)
for (si i2 = v[i].begin(); i2 != v[i].end(); i2++) {
int x = *i1, y = *i2;
e[x] &= ~(1ll << y);
}
f[0] = 0;
cout << dfs((1ll << m) - 1) << endl;
return 0;
}
CF1105E Helping Hiasat的更多相关文章
- CF1105E Helping Hiasat 最大团
传送门 发现自己不会求最大团了可海星 如果将每一个朋友看做点,将两个\(1\)之间存在\(2\)操作的所有朋友之间互相连边,那么我们最后要求的就是这个图的最大独立集. 某个图的最大独立集就是反图的最大 ...
- Codeforces Round #533 (Div. 2) E - Helping Hiasat 最大团
E - Helping Hiasat 裸的最大团,写了一种 2 ^ (m / 2) * (m / 2)的复杂度的壮压, 应该还有更好的方法. #include<bits/stdc++.h> ...
- CodeForces 1105E Helping Hiasat 最大独立集
Helping Hiasat 题解: 如果我们把连续的2出现的人都相互连边的话, 题目就是问最大独立集的答案是多少. 求最大独立集可以将图变成反图, 然后求最大团. 代码: #include<b ...
- 「CF1105E」Helping Hiasat
题目链接 戳我 \(Solution\) 将好友访问你的主页的状态用二进制存下来 其中若第\(i\)位是\(1\),则表示这个好友在第\(i\)个\(1\)操作后访问了你的主页,否则没访问. 所以如果 ...
- 【Codeforces 1105E】Helping Hiasat
Codeforces 1105 E 题意:给你m个事件,每个事件可能是以下两种之一: \(1\),代表此时可以更改用户名 \(2\) \(s\),代表\(s\)来查看是否用户名与其名字相符 一共有\( ...
- Codeforces Round #533 (Div. 2) E. Helping Hiasat(最大独立集)
题目链接:https://codeforces.com/contest/1105/problem/E 题意:有 n 个事件,op = 1 表示我可以修改昵称,op = 2 表示一个名为 s_i 的朋友 ...
- [CF1105E] Helping Hiaset
问题描述 你在某社交网站上面注册了一个新账号,这个账号有\(n(n\leq 10^5)\)次记录.要么就是你更改过一次ID,要么就是一个ID为\(s(|s|\leq 40)\)的朋友访问过你的空间. ...
- Codeforces Round #533 (Div. 2)
C: 题意: 有n个整数ai,数列a有两个神奇的性质.1.所有的整数都在[l,r]范围内.2.这n个数的和能被3整除.现在给出l和r,和个数n,问你有多少种方法构造出数列a,方案数mod1e9+7. ...
- Codeforces Round #533 (Div. 2) Solution
A. Salem and Sticks 签. #include <bits/stdc++.h> using namespace std; #define N 1010 int n, a[N ...
随机推荐
- Elastic Stack之Redis集群使用
Elastic Stack之Redis集群使用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客数据流走向:FileBeat ===>Redis ===>lo ...
- springcloud学习笔记
一.什么是springcloud,有什么作用 Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册.配置中心.消 ...
- Java Hibernate中的悲观锁和乐观锁的实现
锁(locking) 业务逻辑的实现过程中,往往需要保证数据访问的排他性.如在金融系统的日终结算 处理中,我们希望针对某个cut-off时间点的数据进行处理,而不希望在结算进行过程中 (可能是几秒种, ...
- Accord.NET Framework 介绍
阅读目录 1.基本功能与介绍 Accord.NET Framework是在AForge.NET项目的基础上封装和进一步开发而来.因为AForge.NET更注重与一些底层和广度,而Accord.NET ...
- keytool导入导出多条目对比【原】
步骤一:生成orange.keystore和banana.keystore keytool -genkey -alias orange -keyalg RSA -keysize 1024 -keypa ...
- HDU - 6305 RMQ Similar Sequence(笛卡尔树)
http://acm.hdu.edu.cn/showproblem.php?pid=6305 题目 对于A,B两个序列,任意的l,r,如果RMQ(A,l,r)=RMQ(B,l,r),B序列里的数为[0 ...
- java中变量关系
- 065、容器在Weave中如何通信和隔离?(2019-04-08 周一)
参考https://www.cnblogs.com/CloudMan6/p/7491831.html 在host2上执行如下命令: weave launch host1_ip 必须 ...
- java的TCP和UDP编程
TCP 客户端: import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter ...
- SQL Server 2016 附加数据库提示创建文件失败如何解决
1.右键Microsoft SQL Server Management Studio2.以管理员方式运行