CF1105E Helping Hiasat 最大团】的更多相关文章

传送门 发现自己不会求最大团了可海星 如果将每一个朋友看做点,将两个\(1\)之间存在\(2\)操作的所有朋友之间互相连边,那么我们最后要求的就是这个图的最大独立集. 某个图的最大独立集就是反图的最大团 然后暴力dfs求最大团即可 #include<iostream> #include<cstdio> #include<bitset> //This code is written by Itst using namespace std; inline int read(…
题目地址:CF1105E Helping Hiasat 首先将问题转化成图论:对每个人建立一个点,将同一次修改后的所有人代表的点两两连一条边,那么最终所求的就是这个图的最大独立集 我们知道最大独立集是NPC问题,只能暴力搜 裸暴力的时间复杂度为 \(O(2^m)\) ,由于 \(m\leq 40\) ,无法承受 我们知道最大独立集=补图最小团,考虑记忆化搜索,时间复杂度降为 \(O(\sqrt {2^m})\) 我写的代码广泛应用了STL,包括 \(vector\),\(set\),\(map\…
E - Helping Hiasat 裸的最大团,写了一种 2 ^ (m / 2)  * (m / 2)的复杂度的壮压, 应该还有更好的方法. #include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk make_pair #define PLL pair<LL, LL> #define PLI pair<LL, int> #define PII p…
Helping Hiasat 题解: 如果我们把连续的2出现的人都相互连边的话, 题目就是问最大独立集的答案是多少. 求最大独立集可以将图变成反图, 然后求最大团. 代码: #include<bits/stdc++.h> using namespace std; #define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout); #…
题目链接 戳我 \(Solution\) 将好友访问你的主页的状态用二进制存下来 其中若第\(i\)位是\(1\),则表示这个好友在第\(i\)个\(1\)操作后访问了你的主页,否则没访问. 所以如果两位好友都高兴则两位好友的二进制数\(\&\)的值为\(0\) 所以这样就变成了一个最大独立集的问题了 如果\(\&\)不为\(0\)这两个好友不能在一个集合. 看数据范围,我们考虑折半 我们先分成两半,一半的最大独立集合保留.另一半用高维前缀和(实际上时高维\(max\)) 枚举没有处理的独…
题目链接:https://codeforces.com/contest/1105/problem/E 题意:有 n 个事件,op = 1 表示我可以修改昵称,op = 2 表示一个名为 s_i 的朋友查询我当前的名字.一个朋友是高兴的当且仅当他每次查询我的名字都为 s_i,保证每个朋友至少查询一次我的名字,问最多可以有多少个朋友高兴. 题解:在我两次修改昵称之间,若出现不同的朋友,则他们是互斥的,可以在他们之间连一条边,然后求图的最大独立集,而原图的最大独立集等于补图的最大团,所以求补图的最大团…
Codeforces 1105 E 题意:给你m个事件,每个事件可能是以下两种之一: \(1\),代表此时可以更改用户名 \(2\) \(s\),代表\(s\)来查看是否用户名与其名字相符 一共有\(m\leq40\)个人,如果一个人每次看到用户名都与其名字相符,则他会开心,问怎么更改用户名使得开心的人最多? 思路:看每次\(1​\)后面连续的\(2​\),把其中的人两两连边,题目转化成求此图的最大独立集.看到\(m​\)的范围较小,且不能直接做,那么考虑折半搜索.把人分成前一半和后一半,枚举出…
问题描述 你在某社交网站上面注册了一个新账号,这个账号有\(n(n\leq 10^5)\)次记录.要么就是你更改过一次ID,要么就是一个ID为\(s(|s|\leq 40)\)的朋友访问过你的空间. 你有\(m(m\leq 40)\)个朋友.每一个朋友都会访问你的空间至少一次.如果这一个朋友每一次访问你的空间的时候,你的ID和它的ID一样,那么他就会高兴. 求你最多能让多少人高兴. 输入格式 第一行一个两个正整数n,m. 接下来n行每行表示一次记录,有如下两种格式: 1 2 s 其中1表示你更改…
C: 题意: 有n个整数ai,数列a有两个神奇的性质.1.所有的整数都在[l,r]范围内.2.这n个数的和能被3整除.现在给出l和r,和个数n,问你有多少种方法构造出数列a,方案数mod1e9+7. 题解: 一个数被3除只有三种可能.1.整除,2.余1,2.余2. 然后我们再想这个问题,[l,r]区间内,能被3整除的数有多少?a0=r/3-l/3.余1/2的数有多少?a1/2=((r-l+1)-a0)/2.(这里具体余1和余2不重要,想想为什么) 我们设f[i][j]为前i个数,和除3余j的方案…
A. Salem and Sticks 签. #include <bits/stdc++.h> using namespace std; #define N 1010 int n, a[N]; int work(int x) { ; ; i <= n; ++i) res += max(, abs(x - a[i]) - ); return res; } int main() { while (scanf("%d", &n) != EOF) { ; i <…