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:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...
随机推荐
- JavaFX开发环境安装配置
JavaFX开发环境安装配置 从Java8开始,JDK(Java开发工具包)包括了JavaFX库. 因此,要运行JavaFX应用程序,您只需要在系统中安装Java8或更高版本. 除此之外,IDE(如E ...
- Redis数据结构之字符串-SDS
C语言中,传统的字符串表示是以空字符结尾的字符数组,Redis的字符串没有直接使用该表示,而是选择构建了一种名为简单动态字符串(simple dynamic string, SDS)的抽象类型. 在R ...
- Nginx网站部署
Nginx网站服务部署 常用的网站服务软件 处理静态资源的服务: apache软件:https://apache.org/ nginx软件:https://nginx.org/ 处理动态资源的服务: ...
- python redis 批量设置过期key
在使用 Redis.Codis 时,我们经常需要做一些批量操作,通过连接数据库批量对 key 进行操作: 关于未过期: 1.常有大批量的key未设置过期,导致内存一直暴增 2.rd需求 扫描出这些ke ...
- vue 学习一 组件生命周期
先上一张vue组件生命周期的流程图 以上就是一个组件完整的生命周期,而在组件处于每个阶段时又会提供一些周期钩子函数以便我们进行一些逻辑操作,而总体来讲 vue的组件共有8个生命周期钩子 beforeC ...
- python 爬取豆瓣电影短评并wordcloud生成词云图
最近学到数据可视化到了词云图,正好学到爬虫,各种爬网站 [实验名称] 爬取豆瓣电影<千与千寻>的评论并生成词云 1. 利用爬虫获得电影评论的文本数据 2. 处理文本数据生成词云图 第一步, ...
- 【JZOJ6409】困难的图论
description 给定由 n 个点 m 条边组成的无向连通图,保证没有重边和自环. 你需要找出所有边,满足这些边恰好存在于一个简单环中.一个环被称为简单环,当且仅当它包含的所有点都只在这个环中被 ...
- Andriod Unity 调用android函数
//首先这是一个前沿 //我看了多的资料,还看了近半个小时的 android activity 的讲解 终于打出了apk //接下来开始 //一步一步的跟着我走 1.创建一个android项目或者一个 ...
- Go 位运算符
Go 位运算符 package main import "fmt" func main() { var a uint = 60 /* 60 = 0011 1100 */ var b ...
- GetWindowLong
函数功能:该函数获得有关指定窗口的信息,函数也获得在额外窗口内存中指定偏移位地址的32位度整型值. 函数原型:LONG GetWindowLong(HWND hWnd,int nlndex): 参数: ...