首先将朋友通过并查集缩起来,因为$P\geq\frac{n(n-1)}{3}$,所以最后最多剩下$46$个点。

将自相矛盾的点删掉,就变成求最大权独立集问题,这等于求补图的最大团。

然后直接用Bron-Kerbosch算法枚举所有极大团,枚举的时候更新答案即可。

时间复杂度$O(3^\frac{n}{3})$。

#include<cstdio>
#define N 46
typedef unsigned long long ll;
int n,m,q,i,j,x,y,ans,sum,flag,size[N];ll G[N];
int f[255],v[255],cnt,val[N],g[N][N];char tab[65536];
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
int F(int x){return f[x]==x?x:f[x]=F(f[x]);}
inline int ctz(ll s){
if(!s)return 64;
if(s&65535)return tab[s&65535];
s>>=16;
if(s&65535)return tab[s&65535]+16;
return tab[s>>16]+32;
}
void BronKerbosch(ll allow,ll forbid,int s){
if(!allow&&!forbid){
if(s>ans)ans=s,sum=1;else if(s==ans)sum++;
return;
}
if(!allow)return;
int pivot=ctz(allow|forbid);
ll z=allow&~G[pivot];
for(int u=ctz(z);u<n;u+=ctz(z>>(u+1))+1){
BronKerbosch(allow&G[u],forbid&G[u],s+size[u]);
allow^=1ULL<<u;forbid|=1ULL<<u;
}
}
void BronKerbosch2(ll allow,ll forbid,int s){
if(!allow&&!forbid){
if(s>ans)ans=s,sum=1;else if(s==ans)sum++;
return;
}
if(!allow)return;
int pivot=ctz(allow|forbid);
ll z=allow&~G[pivot];s++;
for(int u=ctz(z);u<n;u+=ctz(z>>(u+1))+1){
BronKerbosch2(allow&G[u],forbid&G[u],s);
allow^=1ULL<<u;forbid|=1ULL<<u;
}
}
int main(){
for(i=0;i<65536;i++)tab[i]=__builtin_ctz(i);
read(n),read(m),read(q);
for(i=1;i<=n;i++)f[i]=i;
while(m--){
read(x),read(y);
if(F(x)!=F(y))f[f[x]]=f[y];
}
for(i=1;i<=n;i++)v[i]=-1;
for(i=1;i<=n;i++){
if(v[F(i)]<0)v[f[i]]=cnt++;
val[v[f[i]]]++;
}
while(q--){
read(x),read(y);
x=v[f[x]],y=v[f[y]];
if(x==y)val[x]=0;else g[x][y]=g[y][x]=1;
}
for(n=cnt,cnt=i=0;i<n;i++)if(val[i])v[i]=cnt,f[cnt++]=i;
if(!cnt)return puts("0 1"),0;
for(i=0;i<n;i++)if(val[i])size[v[i]]=val[i];
for(n=cnt,i=0;i<n;i++)if(size[i]>1)flag=1;
for(i=0;i<n;i++)G[i]=(1ULL<<n)-1-(1ULL<<i);
for(i=0;i<n;i++)for(j=0;j<n;j++)if(g[f[i]][f[j]])G[i]^=1ULL<<j;
flag?BronKerbosch((1ULL<<n)-1,0,0):BronKerbosch2((1ULL<<n)-1,0,0);
return printf("%d %d",ans,sum),0;
}

  

BZOJ3548 : [ONTAK2010]Party的更多相关文章

  1. 【BZOJ】【3550】【ONTAK2010】Vacation

    网络流/费用流 Orz太神犇了这题…… 我一开始想成跟Intervals那题一样了……每个数a[i]相当于覆盖了(a[i]-n,a[i]+n)这个区间……但是这样是错的!!随便就找出反例了……我居然还 ...

  2. BZOJ3550: [ONTAK2010]Vacation

    3550: [ONTAK2010]Vacation Time Limit: 10 Sec  Memory Limit: 96 MBSubmit: 91  Solved: 71[Submit][Stat ...

  3. bzoj 3545&&3551: [ONTAK2010]Peaks &&加强版 平衡树&&并查集合并树&&主席树

    3545: [ONTAK2010]Peaks Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 635  Solved: 177[Submit][Stat ...

  4. BZOJ 3544: [ONTAK2010]Creative Accounting( BST )

    题意 : 一段序列 , 求一段子序列和取余 M 的最大值 其实是一道水题... 前缀和 , 然后就是找 ( sum( r ) - sum( l ) ) % M 的最大值 . 考虑一个 sum( r ) ...

  5. BZOJ 3545: [ONTAK2010]Peaks( BST + 启发式合并 + 并查集 )

    这道题很好想, 离线, 按询问的x排序从小到大, 然后用并查集维护连通性, 用平衡树维护连通块的山的权值, 合并就用启发式合并.时间复杂度的话, 排序是O(mlogm + qlogq), 启发式合并是 ...

  6. BZOJ 3551: [ONTAK2010]Peaks加强版 [Kruskal重构树 dfs序 主席树]

    3551: [ONTAK2010]Peaks加强版 题意:带权图,多组询问与一个点通过边权\(\le lim\)的边连通的点中点权k大值,强制在线 PoPoQQQ大爷题解传送门 说一下感受: 容易发现 ...

  7. BZOJ 3545: [ONTAK2010]Peaks [Splay启发式合并]

    3545: [ONTAK2010]Peaks 题意:带权图,多组询问与一个点通过边权\(\le x\)的边连通的点中点权k大值 又读错题了,输出点一直WA,问的是点权啊 本题加强版强制在线了,那这道题 ...

  8. bzoj3545: [ONTAK2010]Peaks 重构树 主席树

    题目链接 bzoj3545: [ONTAK2010]Peaks 题解 套路重构树上主席树 代码 #include<cstdio> #include<algorithm> #de ...

  9. 【BZOJ3545】 [ONTAK2010]Peaks

    BZOJ3545 [ONTAK2010]Peaks Solution 既然会加强版,直接把强制在线的操作去掉就好了. 代码实现 #include<stdio.h> #include< ...

随机推荐

  1. poj2492(种类并查集/各种解法)

    题目链接: http://poj.org/problem?id=2492 题意: 有t组测试数据, 对于每组数据,第一行n, m分别表示昆虫的数目和接下来m行x, y, x, y表示教授判断x, y为 ...

  2. Stuts2的"struts.devMode"设置成true后,不起作用,仍需要重启tomcat

    在项目的struts.xml加入了常量配置:<constant name="struts.devMode" value="true" />后,重启服 ...

  3. hdu 1711Number Sequence

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 数字KMP,原来还能这么用 #include<stdio.h> ],b[]; ]; ...

  4. mysql里表以及列的增删改查

    在一个表里插入数据(增)   insert into 表名 (需要插入的列名如  id,name,age)values    (1,'张三',20), (2,'李四',30):     查询表内容(查 ...

  5. logstash json和rubydebug 第次重启logstash都会把所有的日志读完 而不是只读入新输入的内容

    查看一下agent端的shipper的配置: # cat logstash_test2.shipper.conf input { file { path => ["/apps/logs ...

  6. Java集合源码学习(三)LinkedList分析

    前面学习了ArrayList的源码,数组是顺序存储结构,存储区间是连续的,占用内存严重,故空间复杂度很大.但数组的二分查找时间复杂度小,为O(1),数组的特点是寻址容易,插入和删除困难.今天学习另外的 ...

  7. 菜鸟学Linux命令:lsof命令 查找指定用户、进程、端口打开的文件

    lsof,list open files, 是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件. 命令格式:ls ...

  8. 【JAVA正则表达式】

    一.String类. java.lang.Object |--java.lang.String 常用方法:  String replaceAll(String regex, String replac ...

  9. HTML页面实现返回顶部效果 go to top

    1.首先导入jQuery插件. 2.js代码: $(window).scroll(function () { if($(window).scrollTop()>=100) { $(". ...

  10. Bat脚本实现MySQL数据库SQL文件备份

    @echo offecho 在线兑奖系统自动备份脚本(请勿关闭) 联系人:  电话::loopset /a "FDate=%date:~,4%%date:~5,2%%date:~8,2%&q ...