Atcoder:AGC004F Namori
传送门
先考虑树,树是一个二分图。
看到是二分图并且每次是对两边的同色的点反色可以想到转化:让奇数层的点为黑,偶数为白,变成每次可以交换两个点的颜色。
把黑看成 \(-1\),白看成 \(1\),那么求一个子树和,考虑每一条边的贡献可以得到 \(ans=\sum_{i=1}^{n} |sum_i|\)
如果根的 \(sum\) 不为 \(0\),那么肯定是无解的。
对于基环树,先考虑奇环。
断开奇环的一条边 \((u,v)\),变成树,\(u,v\) 肯定是同一边的点。
操作一次 \((u,v)\) 相当于可以两边可以同时新增加白点/黑点,也就是可以把根的 \(sum\) 用这两个点来变成 \(0\),(\(sum\) 必须为偶数)平均分配之后用树的做法即可。
考虑偶环。
断开偶环的一条边 \((u,v)\),变成树,\(u,v\) 肯定不是同一边的点。
操作一次 \((u,v)\) 相当于是让左右的点走了一次捷径。
设用的次数为 \(x\)。
如果一个点同时包含或不包含 \(u,v\) 两个点,那么 \(sum\) 一定不变。
否则加上或者减去 \(x\)。
相当是是要求 \(|x|+\sum |sum_i-x| + \sum |sum_i+x|\)
经典问题,排序之后取中位数即可。
# include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn(1e5 + 5);
struct Edge { int to, next; };
int n, m, first[maxn], cnt, sum[maxn], fa[maxn], dsu[maxn], deep[maxn], a, b, ans, val[maxn];
Edge edge[maxn << 1];
inline int Find(int x) { return (dsu[x] ^ x) ? dsu[x] = Find(dsu[x]) : x; }
inline void Add(int u, int v) {
edge[cnt] = (Edge){v, first[u]}, first[u] = cnt++;
edge[cnt] = (Edge){u, first[v]}, first[v] = cnt++;
}
void Dfs(int u, int ff, int d) {
int e, v;
sum[u] = d;
for (e = first[u]; ~e; e = edge[e].next)
if ((v = edge[e].to) ^ ff) {
deep[v] = deep[u] + 1;
fa[v] = u, Dfs(v, u, -d);
sum[u] += sum[v];
}
}
int main() {
int i, u, v, len = 1;
memset(first, -1, sizeof(first));
scanf("%d%d", &n, &m);
if (n & 1) return puts("-1"), 0;
for (i = 1; i <= n; ++i) dsu[i] = i;
for (i = 1; i <= m; ++i) {
scanf("%d%d", &u, &v);
if (Find(u) ^ Find(v)) Add(u, v), dsu[Find(u)] = Find(v);
else a = u, b = v;
}
if (!a) {
Dfs(1, 0, 1);
if (sum[1]) return puts("-1"), 0;
}
else {
Dfs(a, 0, 1);
if (deep[b] & 1) {
if (sum[a]) return puts("-1"), 0;
for (i = b; i ^ a; i = fa[i]) val[++len] = sum[i], sum[i] = 0;
sort(val + 1, val + len + 1), v = val[(len + 1) >> 1];
for (i = 1; i <= len; ++i) ans += abs(val[i] - v);
}
else {
if (sum[a] & 1) return puts("-1"), 0;
v = sum[a] >> 1, ans = abs(v), sum[a] = 0;
for (i = b; i ^ a; i = fa[i]) sum[i] -= v;
}
}
for (i = 1; i <= n; ++i) ans += abs(sum[i]);
printf("%d\n", ans);
return 0;
}
Atcoder:AGC004F Namori的更多相关文章
- 2017国家集训队作业[agc004f]Namori
2017国家集训队作业[agc004f]Namori 题意: 给你一颗树或环套树,树上有\(N\)个点,有\(M\)条边.一开始,树上的点都是白色,一次操作可以选择一条端点颜色相同的边,使它的端点颜色 ...
- AtCoder AGC004F Namori (图论)
题目链接 https://atcoder.jp/contests/agc004/tasks/agc004_f 题解 神仙题.. 首先考虑树的情况,树是二分图,因此假设我们对二分图进行黑白染色,那么操作 ...
- AtCoder:C - Nuske vs Phantom Thnook
C - Nuske vs Phantom Thnook https://agc015.contest.atcoder.jp/tasks/agc015_c 题意: n*m的网格,每个格子可能是蓝色, 可 ...
- AGC004F Namori 树形DP、解方程(?)
传送门 因为不会列方程然后只会树上的,被吊打了QAQ 不难想到从叶子节点往上计算答案.可以考虑到可能树上存在一个点,在它的儿子做完之后接着若干颜色为白色的儿子,而当前点为白色,只能帮助一个儿子变成黑色 ...
- [agc004f]Namori 贪心
Description 现在给你一张NN个点MM条边的连通图,我们保证N−1≤M≤NN−1≤M≤N,且无重边和自环. 每一个点都有一种颜色,非黑即白.初始时,所有点都是白色的. 想通过执行 ...
- [AGC004F] Namori
Description 现在给你一张N个点M条边的连通图,我们保证N−1≤M≤N,且无重边和自环. 每一个点都有一种颜色,非黑即白.初始时,所有点都是白色的. "全"想通过执行若干 ...
- AtCoder刷题记录
构造题都是神仙题 /kk ARC066C Addition and Subtraction Hard 首先要发现两个性质: 加号右边不会有括号:显然,有括号也可以被删去,答案不变. \(op_i\)和 ...
- 贪心/构造/DP 杂题选做Ⅲ
颓!颓!颓!(bushi 前传: 贪心/构造/DP 杂题选做 贪心/构造/DP 杂题选做Ⅱ 51. CF758E Broken Tree 讲个笑话,这道题是 11.3 模拟赛的 T2,模拟赛里那道题的 ...
- NOIp模拟赛二十九
又是受虐的一天呢~接下来四天都要打模拟赛QAQ 今日分数:0(100)+100+0=100 A题O(读入)结论题判断结果时没return 0被subtask卡成0分,喜提fstQAQ,B题DP,C题不 ...
随机推荐
- cisco 的ACL
搞网络好几年了,怎么说呢,水平一直停留在NA-NP之间,系统的学完NA后,做了不少实验,后来也维护了企业的网络,各种网络设备都玩过(在商汤用的Juniper srx 550 我认为在企业环境,非IDC ...
- MySQL order by的实现
1.使用索引的已有顺序 2.filesort算法 filesort算法的执行流程 filesort相关的参数 sort_buffer_size 算法排序缓冲区的大小,线程级缓存 max_l ...
- vue10行代码实现上拉翻页加载更多数据,纯手写js实现下拉刷新上拉翻页不引用任何第三方插件
vue10行代码实现上拉翻页加载更多数据,纯手写js实现下拉刷新上拉翻页不引用任何第三方插件/库 一提到移动端的下拉刷新上拉翻页,你可能就会想到iScroll插件,没错iScroll是一个高性能,资源 ...
- 找到IIS 站点对应的站点日志
IIS6 下 IIS7 下 1 找到日志文件的路径 2 找到站点ID 3 打开日志文件路径,找到站点ID 对应的日志文件夹.文件夹的最后一位数字,就对应着站点ID.
- flask加vue 动画 加载更多
曾经使用flask_paginate(地址:https://blog.csdn.net/qq_42239520/article/details/80378095)进行分页,现在又想新的想法,怎么才能和 ...
- spring + mybatis 存取clob
存的时候会比较麻烦,需要使用select for update的方式更新数据,如果原来没有这一条数据,还需要先新增,新增的时候需要将clob字段存为oracle.sql.CLOB.empty_lob( ...
- .Net 站点跨域问题及解决方法
一.什么是站点跨域 了解跨域之前, 先了解下什么同源策略?百度百科:同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功 ...
- Element ui tree树形控件获取父节点id
Element-ui官网给的方法 getCheckedKeys() { console.log(this.$refs.tree.getCheckedKeys()); }, 这种只有在所有子级都被选中的 ...
- jsp链接orcl
自己整的!好用滴!!希望能帮到一些初学者! package lobsterwwww; import java.sql.Connection; import java.sql.DriverManager ...
- 工厂模式——java设计模式
工厂模式 目录 何为工厂模式 工厂方法与抽象工厂 如何在Java EE中通过@Producers与@Inject注解实现工厂模式 如何创建自定义注解以及通过@Qualifier消除具体实现之间的歧义 ...