题意:

给你一个图,问你有多少个方案把他分成连个新的图。使得一个图是一个团,另外一个是独立集

一些闲话:

以前做过一次这个题..当时听说爆搜可以过,就无脑莽过去了..

也没有思考为什么爆搜能过,或者有没有非爆搜的方法..

其实这题是有非爆搜,并且是线性的做法

题解:

先考虑这么一个事实:加入我们得到了一个合法解,那么剩下的合法解肯定可以通过下面的调整得到:

1.从团里面丢一个点到独立集里面

2.从独立集里面丢一个点到团里面

3.独立集和团交换一个点

显然,所有操作都不可能设计独立集/团里面的两个点,这样就使问题好办了许多

考虑怎么得到一个合法解

一般来说,我们可以贪心来做,按度数排一个序,然后从大到小看,能放到团里面就放到团里面,否则丢到独立集里面

最后看一下独立集是否合法..

尝试证明这个贪心的正确性,我们只需要证明只要有解,这样一定可以找出来即可

先假设i,j,按度数排序后i在j前面,如果存在一个方案是把i放到独立集里面,而把j放到团里面,不难得到i和j是等价的,因为j要和所有i连出的边连边

因此这两个点谁放哪里都一样

于是我们就得到了一个合法解

定义可以自由转化阵营的是自由点,否则是非自由点

两个都是自由点的方案很好算,两个都是非自由点的可以发现是没有的

那么各有一般怎么算..其实也是暴力就好了,看看唯一影响这个点非自由的是不是自由点就好了

这个部分可以写成O(m)

至于排序,可以用桶排来解决,因此总复杂度就是O(n+m)

但是因为这个题数据很不好造..因此爆搜什么的很难卡..n,m如果同阶,显然团的个数也会很少,因此,就算暴力一点写成O(n^2+m)也应该可以过n,m同阶的点

然后就没什么了

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
typedef long long LL;
const int N=;
int T;
int n,m;
struct qq
{
int x,y,last;
}e[N*N*];int num,last[N];
void init (int x,int y)
{
e[++num].x=x;e[num].y=y;
e[num].last=last[x];
last[x]=num;
}
int du[N];
int id[N];
bool cmp (int x,int y) {return du[x]>du[y];}
bool in[N];
int o[N];
int read ()
{
char ch=getchar();int x=;
while (ch<''||ch>'') ch=getchar();
while (ch>=''&&ch<='') {x=x*+ch-'';ch=getchar();}
return x;
}
int main()
{
T=read();
while (T--)
{
num=;memset(last,-,sizeof(last));
//scanf("%d%d",&n,&m);
n=read();m=read();
for (int u=;u<=n;u++) du[u]=;
for (int u=;u<=m;u++)
{
int x,y;
//scanf("%d%d",&x,&y);
x=read();y=read();
init(x,y);init(y,x);
du[x]++;du[y]++;
}
for (int u=;u<=n;u++) id[u]=u,in[u]=false;
sort(id+,id++n,cmp);
int cnt=;//有多少个
for (int u=;u<=n;u++)
{
int x=id[u];int sum=;
for (int i=last[x];i!=-;i=e[i].last) sum=sum+in[e[i].y];
if (sum==cnt) {in[x]=true;cnt++;}
}
bool tf=true;
for (int u=;u<=num;u++) if (in[e[u].x]==false&&in[e[u].y]==false) {tf=false;break;}
if (tf==false) {printf("0\n");continue;}
int cnt1=,cnt2=;
for (int u=;u<=n;u++)
{
o[u]=;
for (int i=last[u];i!=-;i=e[i].last) o[u]=o[u]+(in[u]!=in[e[i].y]);
if (in[u]==true&&o[u]==) cnt1++;
if (in[u]==false&&o[u]==cnt) cnt2++;
}
int ans=(cnt!=n);//printf("%d %d\n",ans,n);
ans=ans+(cnt1+)*(cnt2+)-; if (cnt==&&cnt1==) ans--;
// printf("%d %d %d %d\n",ans,cnt1,cnt2,cnt);
int tot=;
for (int u=;u<=n;u++) if (in[u]&&du[u]==cnt-) tot++;
for (int u=;u<=n;u++) if (in[u]==false&&du[u]==cnt-)
{
int now=;
for (int i=last[u];i!=-;i=e[i].last)
{
int y=e[i].y;
if (in[y]&&du[y]==cnt-) now++;
}
// if (now>tot) printf("FUCK!\n");
ans=ans+tot-now;
}
printf("%d\n",ans);
}
return ;
}

bzoj 3579: 破冰派对的更多相关文章

  1. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  2. < < < 2013年国家集训队作业 > > >

    完成题数/总题数:  道/37道 1.  A1504. Book(王迪): 数论+贪心   ★★☆        2013中国国家集训队第二次作业 2.  A1505. 树(张闻涛): 倍增LCA+可 ...

  3. 【清北学堂2018-刷题冲刺】Contest 9

     前几天本蒟蒻一直在颓废所以这篇题解咕了很久,而且最后一个题目不太会,最终也没完成,非常惭愧.  写这些题目收获相当大.后面的日子呢,我会继续着手刷NOIP题目和Codeforces题目.  到这里就 ...

  4. BZOJ 1631==USACO 2007== POJ 3268 Cow Party奶牛派对

    Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 19226   Accepted: 8775 Description One ...

  5. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  6. BZOJ 3275: Number

    3275: Number Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 874  Solved: 371[Submit][Status][Discus ...

  7. BZOJ 2879: [Noi2012]美食节

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1834  Solved: 969[Submit][Status] ...

  8. bzoj 4610 Ceiling Functi

    bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...

  9. BZOJ 题目整理

    bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...

随机推荐

  1. ArabellaCPC 2019

    链接:http://codeforces.com/gym/102263 A: 签到题:A * B . B: 题意:类似取石子游戏,每个人可以取max(1, n(当前剩余) - k)个,最后取完的人赢, ...

  2. jmeter 读写excel插件编写教程系列(1) -开篇

    不知道为什么,jmeter 竟然不提供 读写excel 的Sampler! 但是在我们自动化接口测试过程中,参数化.保存测试数据,用excel 是比较好的解决方案! 接下来一段儿时间,大虫会抽出一些时 ...

  3. html5本地存储(二)--- SQLList

    html5内置了2种本地数据库,一是被称为“SQLLite”,可以通过SQL语言来访问文件型SQL数据库.二是被称为“indexedDB” 的NoSQL类型的数据库 这篇主要讲SQLLite 在js中 ...

  4. 53-Ubuntu-打包压缩-3-gzip压缩和解压缩介绍

    gzip tar与gzip命令结合可以实现文件打包和压缩. tar只负责打包文件,但不负责压缩. 用gzip压缩tar打包后的文件,其扩展名一般为xxx.tar.gz. 注:在Linux中,最常见的压 ...

  5. POJ 3469 /// 最大流Dinic

    题目大意: N个模块 在核A上执行花费a[i] 在核B上执行花费b[i] 有M个模块组合(d1,d2) 若d1模块与d2模块在不同核上执行需多花费w[i] 求执行所有模块所需的最小花费 挑战P237 ...

  6. SpringBoot Controller 中使用多个@RequestBody的正确姿势

    最近遇到Controller中需要多个@RequestBody的情况,但是发现并不支持这种写法, 这样导致 1.单个字符串等包装类型都要写一个对象才可以用@RequestBody接收: 2.多个对象需 ...

  7. 利用MySqlBulkLoader生成csv文件,批量添加数据

    DataTable dt = new DataTable(); dt.Columns.Add("Id", typeof(int)); dt.Columns.Add("Yw ...

  8. Linux下NODE配置NODE_PATH变量

    在当我们使用了npm install express -g安装之后的,会安装在全局目录下,但是如果直接用Node来启动程序的话,是无法发现这个包的,原因就在于NODE_PATH这个环境变量设置的不正确 ...

  9. what codes does sudo command do in Linux?

    sometime, to make your change of configuration file be effective to web application, we have to rest ...

  10. tcmalloc jemalloc 和ptmalloc 对比

    ptmalloc 是glibc的内存分配管理 tcmalloc 是google的内存分配管理模块 jemalloc 是BSD的提供的内存分配管理 三者的性能对比参考从网上的一个图如下: 自己测试了一下 ...