【构造】Tinkoff Challenge - Final Round (Codeforces Round #414, rated, Div. 1 + Div. 2) D. Labelling Cities
考试的时候想的是,将所有的完全子图缩起来,然后如果剩下的是一条链,依次对其进行标号即可。
看了官方题解,发现完全子图这个条件太强了,缩点的条件仅仅需要保证原本两个点的“邻接表”相同即可。(注意这里的“邻接表”需要把其自身也放进去)
自己构造一下,发现这个比较容易理解。
被缩在一起的点的标号相同。如果缩完是一条链,对其依次进行标号。否则无解。
复杂度发现比较鬼畜,但是想一下就会知道其不会太高。官方说可以证明是
。
#include<cstdio>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;
int n,m,xs[300010],ys[300010];
struct data{
int id;
vector<int>ljb;
}nodes[300010];
bool cmp(const data &a,const data &b){
return a.ljb<b.ljb;
}
int bel[300010],nn,col[300010],du[300010];
set<pair<int,int> >S;
vector<int>G[300010];
int pen;
void dfs(int U){
col[U]=++pen;
for(int i=0;i<G[U].size();++i){
if(!col[G[U][i]]){
dfs(G[U][i]);
}
}
}
int main(){
// freopen("d.in","r",stdin);
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i){
scanf("%d%d",&xs[i],&ys[i]);
nodes[xs[i]].ljb.push_back(ys[i]);
nodes[ys[i]].ljb.push_back(xs[i]);
}
for(int i=1;i<=n;++i){
nodes[i].id=i;
nodes[i].ljb.push_back(i);
sort(nodes[i].ljb.begin(),nodes[i].ljb.end());
}
sort(nodes+1,nodes+n+1,cmp);
int sta;
for(int i=1;i<=n;++i){
if(nodes[i].ljb!=nodes[i-1].ljb){
sta=i;
}
if(nodes[i].ljb!=nodes[i+1].ljb){
++nn;
for(int j=sta;j<=i;++j){
bel[nodes[j].id]=nn;
}
}
}
for(int i=1;i<=m;++i){
if(bel[xs[i]]!=bel[ys[i]]){
if(S.find(make_pair(bel[xs[i]],bel[ys[i]]))==S.end() &&
S.find(make_pair(bel[ys[i]],bel[xs[i]]))==S.end()){
S.insert(make_pair(bel[xs[i]],bel[ys[i]]));
S.insert(make_pair(bel[ys[i]],bel[xs[i]]));
G[bel[xs[i]]].push_back(bel[ys[i]]);
G[bel[ys[i]]].push_back(bel[xs[i]]);
++du[bel[xs[i]]];
++du[bel[ys[i]]];
}
}
}
int cnt=0;
for(int i=1;i<=nn;++i){
if(du[i]==1){
++cnt;
}
else if(du[i]>2){
puts("NO");
return 0;
}
}
if(cnt==2 || (nn==1 && cnt==0)){
for(int i=1;i<=nn;++i){
if(du[i]==1 || du[i]==0){
dfs(i);
break;
}
}
puts("YES");
for(int i=1;i<n;++i){
printf("%d ",col[bel[i]]);
}
printf("%d\n",col[bel[n]]);
}
else{
puts("NO");
}
return 0;
}
【构造】Tinkoff Challenge - Final Round (Codeforces Round #414, rated, Div. 1 + Div. 2) D. Labelling Cities的更多相关文章
- Tinkoff Challenge - Final Round (Codeforces Round #414, rated, Div. 1 + Div. 2) 继续跪一把
这次的前三题挺简单的,可是我做的不快也不对. A. Bank Robbery time limit per test 2 seconds memory limit per test 256 megab ...
- Tinkoff Challenge - Final Round (Codeforces Round #414, rated, Div. 1 + Div. 2)
A: 思路:就是找b,c之前有多个s[i] 代码: #include<stdio.h>#define ll long longusing namespace std;ll a,b,c;in ...
- Tinkoff Challenge - Final Round (Codeforces Round #414, rated, Div. 1 + Div. 2) 【ABC】
老年人题解,语言python3 A - Bank Robbery 题意:给你ABC,以及n个数,问你在(B,C)之间的数有多少个. 题解:对于每个数判断一下就好了嘛 x,y,z = map(int,i ...
- 【贪心】【multiset】Tinkoff Challenge - Final Round (Codeforces Round #414, rated, Div. 1 + Div. 2) C. Naming Company
考虑两个人,先把各自的集合排个序,丢掉一半,因为比较劣的那一半一定用不到. 然后贪心地放,只有两种决策,要么把一个最优的放在开头,要么把一个最劣的放在结尾. 如果我的最优的比对方所有的都劣(或等于), ...
- Tinkoff Challenge - Final Round (ABC)
A题:从两个保安中间那钞票 #include <bits/stdc++.h> using namespace std; int main() { int a,b,c; scanf(&quo ...
- CF Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined)
1. Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) B. Batch Sort 暴力枚举,水 1.题意:n*m的数组, ...
- 构造 Codeforces Round #302 (Div. 2) B Sea and Islands
题目传送门 /* 题意:在n^n的海洋里是否有k块陆地 构造算法:按奇偶性来判断,k小于等于所有点数的一半,交叉输出L/S 输出完k个L后,之后全部输出S:) 5 10 的例子可以是这样的: LSLS ...
- Codeforces Round #275 (Div. 2) C - Diverse Permutation (构造)
题目链接:Codeforces Round #275 (Div. 2) C - Diverse Permutation 题意:一串排列1~n.求一个序列当中相邻两项差的绝对值的个数(指绝对值不同的个数 ...
- Codeforces Round #275 (Div. 1)A. Diverse Permutation 构造
Codeforces Round #275 (Div. 1)A. Diverse Permutation Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 ht ...
随机推荐
- C# 关于调用微信接口的代码
调用微信接口前需要准备的内容. 1.微信公众平台的appid 2.微信公众平台的secret 3..获取tokenid 4.获取ticket 5.生成签名的随机串 6.生成签名的时间戳 7.生成签名 ...
- 利用最新Apache解析漏洞(CVE-2017-15715)绕过上传黑名单
转载自:https://www.leavesongs.com/PENETRATION/apache-cve-2017-15715-vulnerability.html 目标环境: 比如,目标存在一个上 ...
- [Leetcode Week14]Construct Binary Tree from Inorder and Postorder Traversal
Construct Binary Tree from Inorder and Postorder Traversal 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/pr ...
- printk %pF %pS含义【转】
作者:啐楼链接:https://www.zhihu.com/question/37769890/answer/73532192来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出 ...
- SSH认证原理和批量分发管理
SSH密码认证原理 几点说明: 1.服务端/etc/ssh目录下有三对公钥私钥: [root@m01 ssh]# ls moduli ssh_config sshd_config ssh_host_d ...
- JS页面之间传值
父页面与子页面之间有多种传值的方式: 第一种,通过window.open的方法打开一个新的页面,在新的页面里面通过window.opener来获取对象,以下为实例 父页面: function open ...
- 百度之星资格赛--IP聚合
IP聚合 Accepts: 1901 Submissions: 4979 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/6553 ...
- 下载安装go插件包报错fatal: unable to access 'https://github.com/golang/tools.git/': OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054
使用git命令来给vscode安装go插件的时候报错,如下: $ git clone https://github.com/golang/tools.git tools Cloning into 't ...
- hdu 1041(递推,大数)
Computer Transformation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/ ...
- STL模板整理 list
介绍: list容器是一种序列式容器,它是STL实现的双向链表,与vector相比它可以实现快速的插入和删除,但是不能够快速的随机访问. 头文件: #include <list> 构造函数 ...