2019湘潭校赛 G(并查集)
要点
- 题目传送
- 题目本质是每个点必属于两个集合中的一个,伴随的性质是:如果一个人说别人true,则他们一定属于同一阵营;如果说别人fake,一定不属于同一阵营。
- 每个点拆为\(i\)和\(i + n\)分别代表他属于某种阵营(目前还不确定),然后根据上述性质边读入边合并同类。
- 这样扫一遍,如果某个\(i\)和\(i + n\)属于同一阵营则矛盾,无解。
- 若有解,对于每个点扫一遍和他同阵营的人,为了使fakeman尽可能地少,\(<=n\)的人少就把\(<=n\)视为fakeman;否则把\(>n\)的视为fakeman。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
int T, n, m;
int f[maxn << 1], ans[maxn], sz[maxn << 1];
vector<int> v[maxn << 1];
int getf(int v) {
return v == f[v] ? v : f[v] = getf(f[v]);
}
void merge(int u, int v) {
f[getf(u)] = getf(v);
}
int main() {
for (scanf("%d", &T); T--;) {
scanf("%d %d", &n, &m);
for (int i = 1; i <= n * 2; i++) f[i] = i, v[i].clear();
memset(ans, 0, sizeof ans);
memset(sz, 0, sizeof sz);
for (int i = 1, u, v, w; i <= m; i++) {
scanf("%d %d %d", &u, &v, &w);
if (w) merge(u, v), merge(u + n, v + n);
else merge(u, v + n), merge(u + n, v);
}
int flag = 1;
for (int i = 1; i <= n; i++)
if (getf(i) == getf(i + n)) {
flag = 0; break;
}
if (!flag) {
puts("-1"); continue;
}
for (int i = 1; i <= n * 2; i++) v[getf(i)].push_back(i);
for (int i = 1; i <= n; i++) sz[getf(i)]++;
for (int i = 1; i <= n; i++) {
if (ans[i]) continue;
int fa = getf(i);
if (v[fa].size() - sz[fa] >= sz[fa]) {
for (int j : v[fa])
if (j > n) ans[j - n] = 2;
else ans[j] = 1;
} else {
for (int j : v[fa])
if (j > n) ans[j - n] = 1;
else ans[j] = 2;
}
}
for (int i = 1; i <= n; i++) printf("%d", ans[i] - 1);
puts("");
}
}
2019湘潭校赛 G(并查集)的更多相关文章
- 2019湘潭校赛 H(dp)
题目传送 dp是常规的:\(m^2\)的预处理:把位置存进vector然后\(O(1)\)算出想要的:WA点:要注意特意设置一下val[i][v.size()]=0,即全天都放鸽子则花费时间为0. # ...
- 2019湘潭校赛 E(答案区间维护)
题目传送 思路是始终维护西瓜数量的区间,即L代表目前可以达到的最少的,R是最多的,然后判断一下. #include <bits/stdc++.h> using namespace std; ...
- luogu4269 Snow Boots G (并查集)
对于某个靴子,如果0代表某个格能走,1代表不能走,那么只要连续的1的个数的最大值>=靴子的步长,那这个靴子就不能用. 那么只要对靴子和格子都按深度排个序,然后从大到小来扫一遍(靴子越来越浅,能走 ...
- 2019南昌网络赛G. tsy's number
题意:\(\sum_{i=1}^n\sum_{j=1}^n\sum_{k=1}^n\frac{\phi(i)*\phi(j^2)*\phi(k^3)}{\phi(i)*\phi(j)*\phi(k)} ...
- Little Sub and Piggybank (杭师大第十二届校赛G题) DP
题目传送门 题意:每天能往存钱罐加任意实数的钱,每天不能多于起那一天放的钱数.如果某一天的钱数恰好等于那天的特价商品,则可以买,求最后的最大快乐值. 思路:先来一段来自出题人的题解: 显然的贪心:如果 ...
- 山东理工大学第七届ACM校赛-G 飞花的传送门
G - 飞花的传送门 飞花壕最近手头比较宽裕,所以想买两个传送门来代步(夏天太热,实在是懒得走路).平面上有N个传送门,飞花壕想要挑两个距离最远的传送门带回家(距离为欧几里得距离,即两点之间直线距离) ...
- 浙江理工2015.12校赛-G Jug Hard
Jug Hard Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1172 Solved: 180 Description You have two e ...
- 2019浙大校赛--E--Potion(签到水题)
一丢丢思维就ok 题目大意: 魔法师要煮药,有n个等级的药,所需要的药物为a1,a2...an,意为第n级需要多少药物,下一行为库存的不同等级药物,药物可降级使用不可升级. 思路:从高级药物开始解,把 ...
- 2019浙大校赛--J--Extended Twin Composite Number(毒瘤水题)
毒瘤出题人,坑了我们好久,从基本的素数筛选,到埃氏筛法,到随机数快速素数判定,到费马小定理,好好的水题做成了数论题. 结果答案是 2*n=n+3*n,特判1,2. 以下为毒瘤题目: 题目大意: 输入一 ...
随机推荐
- ES6 Map数据结构
Map JavaScript 的对象(Object),本质上是键值对的集合(Hash 结构),但是传统上只能用字符串当作键.这给它的使用带来了很大的限制. ES6 提供了 Map 数据结构.它类似于对 ...
- 使用OGNL表达式
OGNL表达式(#号的用法) 用法1:访问OGNL上下文和Action上下文,#相当于ActionContext.getContext() 1.如果访问其他Context中的对象,由于他们不是根对象, ...
- 剑指OFFER18 判断一个二叉树的子树
public class a18_IsSubTree { public static boolean hasSubTree(TreeNode treeRoot1, TreeNode treeRoot2 ...
- perl 语言学习总结
.#!/usr/bin/perl -w 内建警告信息,Perl发出警告 .字符串 . 连接符 .重复次数 .字符串与数字之间的自动转换 .; + += *= .= not and or xor .pr ...
- <<Senium2自动化测试>>读书笔记二
为进一步加强Python知识扩展和学习,在朋友的推荐下选择了<<Selenium2自动化测试实战>>,作者胡志恒,基于Python语言实现,以实例的方式详细讲解WebDrive ...
- Katalon Recorder 自动录制 Selenium 爬虫脚本
相信很多小伙伴都用过 Selenium 来完成爬虫工作,今天就给大家带来一个神器,可以录制你的浏览器动作,然后直接生成 Selenium 脚本,是不是心动了? 1 Selenium 简介 Seleni ...
- AIX 7.1上安装Oracle11g
1. 上传oracle 11g介质到AIX 我下载的介质是aix.ppc64_11gR2_database_1of2.zip和aix.ppc64_11gR2_database_2of2.zip, 执行 ...
- Set connectionId threw an exception.
今天调试一个WPF程序时,出现一个问题. 程序运行后抛出异常, "Set connectionId threw an exception. XXXXXXXXXX",原因是依赖的一个 ...
- Ubuntu——查看内存和CPU情况
查看内存及cpu使用情况的命令:top 也可以安装htop工具,这样更直观,安装命令如下:sudo apt-get install htop安装完后,直接输入命令:htop
- 好文章!转载嵌入式LINUX
整理了嵌入式linux学习路线供参考,希望对您有所参考价值! 一.linux入门 目前嵌入式主要开发环境有 Linux.Wince等:Linux因其开源.开发操作便利而被广泛采用.而Linux操作系统 ...