CodeForces 1105E
std:meet in the middle
首先把所有的点分成两部分,设\(f_i\)为前半部分在点集\(i\)中选出的最大独立集,\(g\)为在后半部分选。这个可以在\(O(2^{m/2})\)的时间复杂度里得到。
然后考虑把答案合起来。在f中是从i这个集合里面选出最大独立集,那么后半部分选的集合一定不能有与i相连的边,那么就把i集合里的点的所有与后半部分相连的点标记成不能选,然后在后半部分选剩下的就好了,这些都已经预处理出来了。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cctype>
#include<map>
#include<string>
#include<iostream>
#define qmin(x,y) (x=min(x,y))
#define qmax(x,y) (x=max(x,y))
using namespace std;
inline char gc() {
// static char buf[100000],*p1,*p2;
// return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
return getchar();
}
template<class T>
int read(T &ans) {
ans=0;char ch=gc();T f=1;
while(!isdigit(ch)) {
if(ch==EOF) return -1;
if(ch=='-') f=-1;
ch=gc();
}
while(isdigit(ch))
ans=ans*10+ch-'0',ch=gc();
ans*=f;return 1;
}
template<class T1,class T2>
int read(T1 &a,T2 &b) {
return read(a)!=EOF&&read(b)!=EOF?2:EOF;
}
template<class T1,class T2,class T3>
int read(T1 &a,T2 &b,T3 &c) {
return read(a,b)!=EOF&&read(c)!=EOF?3:EOF;
}
typedef long long ll;
const int Maxn=41;
const int Maxm=1100000;
const int inf=0x3f3f3f3f;
bool mp[Maxn][Maxn],vis[Maxn];
map<string,int> name;
int f[Maxm],g[Maxm],ans,m,x,st[Maxn],top,cnt;
int n;
string s;
signed main() {
// freopen("test.in","r",stdin);
read(n,m);memset(mp,1,sizeof(mp));
for(int i=1;i<=n;i++) {
read(x);
if(x==1) {
for(int j=1;j<=top;j++)
for(int k=j+1;k<=top;k++)
mp[st[j]][st[k]]=mp[st[k]][st[j]]=0;
top=0;memset(vis,0,sizeof(vis));
}
else {
cin>> s;
if(!name.count(s)) name[s]=cnt++;
int x=name[s];
if(!vis[x]) {
vis[x]=0;
st[++top]=x;
}
}
}
for(int j=1;j<=top;j++)
for(int k=j+1;k<=top;k++)
mp[st[j]][st[k]]=mp[st[k]][st[j]]=0;
int s1=m/2,s2=m-s1;
for(int i=0;i<s1;i++) f[1<<i]=1;
for(int i=0;i<(1<<s1);i++)
for(int j=0;j<s1;j++) if(!(i&(1<<j))) {
int flag=1;
for(int k=0;k<s1;k++)
if(i&(1<<k)) flag&=mp[j][k];
qmax(f[i|(1<<j)],f[i]+flag);
}
for(int i=0;i<s2;i++) g[1<<i]=1;
for(int i=0;i<(1<<s2);i++)
for(int j=0;j<s2;j++) if(!(i&(1<<j))) {
int flag=1;
for(int k=0;k<s2;k++)
if(i&(1<<k)) flag&=mp[j+s1][k+s1];
qmax(g[i|(1<<j)],g[i]+flag);
}
for(int i=0;i<(1<<s1);i++) {
int flag=(1<<s2)-1;
for(int j=0;j<s1;j++) if(i&(1<<j))
for(int k=0;k<s2;k++) if(flag&(1<<k)&&!mp[j][k+s1])
flag^=1<<k;
qmax(ans,f[i]+g[flag]);
}
printf("%d\n",ans);
return 0;
}
CodeForces 1105E的更多相关文章
- 【Codeforces 1105E】Helping Hiasat
Codeforces 1105 E 题意:给你m个事件,每个事件可能是以下两种之一: \(1\),代表此时可以更改用户名 \(2\) \(s\),代表\(s\)来查看是否用户名与其名字相符 一共有\( ...
- CodeForces 1105E Helping Hiasat 最大独立集
Helping Hiasat 题解: 如果我们把连续的2出现的人都相互连边的话, 题目就是问最大独立集的答案是多少. 求最大独立集可以将图变成反图, 然后求最大团. 代码: #include<b ...
- Codeforces 1105E 最大独立集 状态DP 中途相遇法
题意:你有一个字符串, 有两种操作,一种是改变字符串,一种是某个用户询问这个字符串,如果一个用户每次查询字符串的时候都是他的用户名,他就会高兴.问最多有多少个用户会高兴? 题意:容易发现,在两个1操作 ...
- python爬虫学习(5) —— 扒一下codeforces题面
上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
- 【Codeforces 738C】Road to Cinema
http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...
- 【Codeforces 738A】Interview with Oleg
http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...
- CodeForces - 662A Gambling Nim
http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...
- CodeForces - 274B Zero Tree
http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...
随机推荐
- PS快速制作下雪效果
PS快速制作下雪效果 具体的制作步骤如下: 1.打开PS,打开素材,打开窗口-动作 2.创建新动作,参数如下图 3.回到图层,建立一个图层,填充黑色,如下图 4.滤镜-像素化-点状化,参数如下图 5. ...
- js-jquery-对象与JSON字符串互相转换
1:jQuery插件支持的转换方式 代码如下: String→Object$.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以将json字符串转 ...
- 【剑指offer】调整数组顺序使奇数位于偶数前面
一.题目: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 二.思路: 用 ...
- Goroutines vs Threads
http://tleyden.github.io/blog/2014/10/30/goroutines-vs-threads/ Here are some of the advantages of G ...
- [py]列表生成式-支持条件,多值的拼接
列表生成式 代码简洁一些 支持多条件, 过滤,或拼接某些值 支持返回多值 是一种生成式 # 生成一个列表 print(list(range(1, 11))) # 生成一个列表x^2 ## 方法1: 返 ...
- MySQL IFNULL()函数用法MySQL
用法说明:IFNULL(expr1,expr2) 如果 expr1 不是 NULL,IFNULL() 返回 expr1,否则它返回 expr2. IFNULL()返回一个数字或字符串值,取决于它被使用 ...
- hdu1864最大报销额(01背包)
http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=187#problem/G 该题要注意的就是每张单子A种类的总和不能大与600,同 ...
- PAT 1103 Integer Factorization[难]
1103 Integer Factorization(30 分) The K−P factorization of a positive integer N is to write N as the ...
- 【Cocos2dx 3.3 Lua】SpriteBatchNode和SpriteFrameCache使用
精灵帧缓存类 一.SpriteFrameCache 精灵帧缓冲类SpriteFrameCache用于存储精灵帧,SpriteFrameCache是一个单例模式,不属于某一个精灵,是所有精灵共享 ...
- 如何用softmax和sigmoid来做多分类和多标签分类
首先,说下多类分类和多标签分类的区别 多标签分类:一个样本可以属于多个类别(或标签),不同类之间是有关联的,比如一个文本被被划分成“人物”和“体育人物”两个标签.很显然这两个标签不是互斥的,而是有关联 ...