bzoj 3579: 破冰派对
题意:
给你一个图,问你有多少个方案把他分成连个新的图。使得一个图是一个团,另外一个是独立集
一些闲话:
以前做过一次这个题..当时听说爆搜可以过,就无脑莽过去了..
也没有思考为什么爆搜能过,或者有没有非爆搜的方法..
其实这题是有非爆搜,并且是线性的做法
题解:
先考虑这么一个事实:加入我们得到了一个合法解,那么剩下的合法解肯定可以通过下面的调整得到:
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: 破冰派对的更多相关文章
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- < < < 2013年国家集训队作业 > > >
完成题数/总题数: 道/37道 1. A1504. Book(王迪): 数论+贪心 ★★☆ 2013中国国家集训队第二次作业 2. A1505. 树(张闻涛): 倍增LCA+可 ...
- 【清北学堂2018-刷题冲刺】Contest 9
前几天本蒟蒻一直在颓废所以这篇题解咕了很久,而且最后一个题目不太会,最终也没完成,非常惭愧. 写这些题目收获相当大.后面的日子呢,我会继续着手刷NOIP题目和Codeforces题目. 到这里就 ...
- BZOJ 1631==USACO 2007== POJ 3268 Cow Party奶牛派对
Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 19226 Accepted: 8775 Description One ...
- BZOJ 2127: happiness [最小割]
2127: happiness Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 1815 Solved: 878[Submit][Status][Di ...
- BZOJ 3275: Number
3275: Number Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 874 Solved: 371[Submit][Status][Discus ...
- BZOJ 2879: [Noi2012]美食节
2879: [Noi2012]美食节 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1834 Solved: 969[Submit][Status] ...
- bzoj 4610 Ceiling Functi
bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...
- BZOJ 题目整理
bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...
随机推荐
- Gradle安装配置(Windows)
在本教程中,我们将学习 Gradle 的安装,对于一个初学者,有时安装开发环境也是一个比较麻烦的问题.如果按照 Gradle 官方网站的说明安装,则可能会遇到一些麻烦,有时还要在互联网上做一些搜索,查 ...
- Node篇
[Node篇] Node.js中的stream(流)- 基础篇 1)什么是stream(流) 流(stream)在 Node.js 中是处理流数据的抽象接口(abstract interface). ...
- Java中static关键字,this关键字
static修饰的成员方法和成员变量都是类方法和类变量,随类的加载而加载 static方法可以直接调用另一个static方法 static中调用普通方法可以通过类的实例对象调用 static不可以修饰 ...
- mount 挂载
mount 挂载出现 这是咋回事.找了找度娘,说是磁盘没有格式化.好吧,mkfs ext4 /dev/sda4 ,提示 没有有效的快给格式化,好奇怪啊,昨天明明分号区了,我记错了. fdisk看一下, ...
- struts2注解方式的验证
struts2的验证分为分编程式验证.声明式验证.注解式验证.因现在的人越来越懒,都追求零配置,所以本文介绍下注解式验证. 一.hello world 参考javaeye的这篇文章,按着做一次,起码有 ...
- day05 mysql pymysql的使用 (前端+flask+pymysql的使用) 索引 解释执行 慢日志 分页性能方案
day05 mysql pymysql 一.pymysql的操作 commit(): 在数据库里增删改的时候,必须要进行提交,否则插入的数据不生效 1.增, 删, 改 #co ...
- mysql-5.5.17-win64 安装方法
双击mysql-5.5.17-win64.msi,即开始安装,出现如下界面 2 点击next,出现如下界面,默认为Typical,改选为Custom,单击Next 3 选择MySQL Server后, ...
- HTML——表单标签
表单标签(掌握) 现实中的表单,类似我们去银行办理信用卡填写的单子. 如下图: 目的是为了收集用户信息. 在我们网页中, 我们也需要跟用户进行交互,收集用户资料,此时也需要表单. 在HTML中,一个完 ...
- Dart编程布尔值
Dart为布尔数据类型提供内置支持.Dart中的布尔数据类型仅支持两个值true和false.关键字bool用于表示DART中的布尔值. 在dart中声明布尔变量的语法如下所示 bool var_na ...
- nextJS使用注意事项
项目参考 nextJs-yicha 1. 采用方案 create-next-app.antd (1)安装 npx create-next-app --example with-ant-design m ...