BZOJ3548 : [ONTAK2010]Party
首先将朋友通过并查集缩起来,因为$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的更多相关文章
- 【BZOJ】【3550】【ONTAK2010】Vacation
网络流/费用流 Orz太神犇了这题…… 我一开始想成跟Intervals那题一样了……每个数a[i]相当于覆盖了(a[i]-n,a[i]+n)这个区间……但是这样是错的!!随便就找出反例了……我居然还 ...
- BZOJ3550: [ONTAK2010]Vacation
3550: [ONTAK2010]Vacation Time Limit: 10 Sec Memory Limit: 96 MBSubmit: 91 Solved: 71[Submit][Stat ...
- bzoj 3545&&3551: [ONTAK2010]Peaks &&加强版 平衡树&&并查集合并树&&主席树
3545: [ONTAK2010]Peaks Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 635 Solved: 177[Submit][Stat ...
- BZOJ 3544: [ONTAK2010]Creative Accounting( BST )
题意 : 一段序列 , 求一段子序列和取余 M 的最大值 其实是一道水题... 前缀和 , 然后就是找 ( sum( r ) - sum( l ) ) % M 的最大值 . 考虑一个 sum( r ) ...
- BZOJ 3545: [ONTAK2010]Peaks( BST + 启发式合并 + 并查集 )
这道题很好想, 离线, 按询问的x排序从小到大, 然后用并查集维护连通性, 用平衡树维护连通块的山的权值, 合并就用启发式合并.时间复杂度的话, 排序是O(mlogm + qlogq), 启发式合并是 ...
- BZOJ 3551: [ONTAK2010]Peaks加强版 [Kruskal重构树 dfs序 主席树]
3551: [ONTAK2010]Peaks加强版 题意:带权图,多组询问与一个点通过边权\(\le lim\)的边连通的点中点权k大值,强制在线 PoPoQQQ大爷题解传送门 说一下感受: 容易发现 ...
- BZOJ 3545: [ONTAK2010]Peaks [Splay启发式合并]
3545: [ONTAK2010]Peaks 题意:带权图,多组询问与一个点通过边权\(\le x\)的边连通的点中点权k大值 又读错题了,输出点一直WA,问的是点权啊 本题加强版强制在线了,那这道题 ...
- bzoj3545: [ONTAK2010]Peaks 重构树 主席树
题目链接 bzoj3545: [ONTAK2010]Peaks 题解 套路重构树上主席树 代码 #include<cstdio> #include<algorithm> #de ...
- 【BZOJ3545】 [ONTAK2010]Peaks
BZOJ3545 [ONTAK2010]Peaks Solution 既然会加强版,直接把强制在线的操作去掉就好了. 代码实现 #include<stdio.h> #include< ...
随机推荐
- CLR via C#(18)——Enum
1. Enum定义 枚举类型是经常用的一种“名称/值”的形式,例如: public enum FeedbackStatus { New, Processing, ...
- GoLang文件增删遍历基本操作
先学一学GO语言实用的一面. package main import ( "path/filepath" "flag" "os" " ...
- Linux进程状态 ( Linux Process State Codes)
进程状态代码及说明: STATE代码 说明 D 不可中断的睡眠. 通常是处于I/O之中. R 运行中/可运行. 正处于运行队列中. S 可中断的睡眠. 等待某事件发生. T 已停止. 可能是因为she ...
- MDX语法之排序函数Order
使用场景: 排列指定集的成员,可以选择保留或打乱原有的层次结构. 语法: Numeric expression syntax Order(Set_Expression, Numeric_Express ...
- <转>ORA-12154: TNS: 无法解析指定的连接标识符
相信作为ORACLE数据库的开发人员没有少碰到“ORA-12154: TNS: 无法解析指定的连接标识符”,今天我也又碰到了类似的情况,将我的解决方法进行小结,希望能对碰到同样问题的友人们提供帮助. ...
- less 入门1
less 入门1 less.html <!DOCTYPE html> <html lang="zh-cn"> <head > <meta ...
- hdu 4278 2012天津赛区网络赛 数学 *
8进制转为10进制 #include<cstdio> #include<iostream> #include<algorithm> #include<cstr ...
- [Spring Batch] 图解Spring Batch原理
找到一副以前学习的图,稻清楚的描述了Spring Batch运行原理:
- C#中的Infinity有个小坑
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 昨天家里有事,上网也不方便,就没有推送文章.今天很累,也不长篇大论了.简单介绍一下最近遇到的 ...
- 管道通信,王明学learn
管道通信 一.通讯目的 1.数据传输 一个进程需要将数据发送给另一个进程. 2.资源共享 多个进程之间共享同样的资源. 3.通知事件 一个进程需要向另一个/组进程发送消息,通知它们发生了某事件. 4. ...