题解 QOJ1869【Power Station of Art】/ SS241006B【结论题】

news/2024/10/7 20:07:19

题解 QOJ1869【Power Station of Art】/ SS241006B【结论题】

Petrozavodsk Summer 2021. Day 6. XJTU Contest, GP of XJTU
XXII Open Cup named after E.V. Pankratiev, Grand Prix of Xi'an

题目描述

给出一个无向图,每个点有点权 \(a\) 和颜色 \(c\) ,其中颜色只会有红蓝两种。

可以进行若干次操作,每次可以选择一条边 \((u,v)\) 并进行以下操作:

  1. 交换 \(a_u,a_v\)

  2. \(c_u=c_v\),则将 \(c_u,c_v\) 同时改变,即若原来是红色则变成蓝色,反之亦然。

给出初始的点权和颜色,以及目标的点权和颜色。

你需要判断能否通过若干次操作使每个点都达到目标。

对于所有数据,\(1 \le \sum n,\sum m\le 10^{5}\) ,点权在 \(1\)\(10^6\) 之间,不包含自环,可能有重边,不保证图连通。

solution

观察到操作等价于:交换 \(a_u, a_v\),交换 \(c_u, c_v\),分别翻转 \(c_u, c_v\)。证明从略。至此,本题结束,可以在 \(O(n+m)\) 的时间复杂度内解决。

若原图为二分图,则一个权值要从一部点到另一部点一定伴随着其附带颜色的改变。由于操作可逆,对每个连通块,我们使原图和目标图的所有点全都迁移至左部点,如果此时它们的颜色、权值都对应相同,则可以完成。

若原图不为二分图,则存在奇环,意味着一个权值附带的颜色可以通过控制其是否经过奇环来随意改变。因此只需要对每个连通块,判断原图和目标图的权值集合是否相同即可。

注意需要对每个连通块特判原图红色点个数是否在模 \(2\) 意义下与目标图红色点个数相等。

code

#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL
#define debug(...) (void)fprintf(stderr, ##__VA_ARGS__)
#else
#define endl "\n"
#define debug(...) (void)0
#endif
using LL = long long;
int n, m, w1[1000010], w2[1000010], col[1000010];
char col1[1000010], col2[1000010];
vector<int> g[1000010], V;
bool ef;
void ffl(int u) {V.push_back(u);for (int v : g[u]) if (!col[v]) col[v] = 3 - col[u], ffl(v); else if (col[u] != 3 - col[v]) ef = false;
}
int mian() {cin >> n >> m;for (int i = 1; i <= n; i++) g[i].clear(), col[i] = 0;for (int i = 1, u, v; i <= m; i++) cin >> u >> v, g[u].push_back(v), g[v].push_back(u);for (int i = 1; i <= n; i++) cin >> w1[i];for (int i = 1; i <= n; i++) cin >> col1[i];for (int i = 1; i <= n; i++) cin >> w2[i];for (int i = 1; i <= n; i++) cin >> col2[i];for (int rt = 1; rt <= n; rt++) if (!col[rt]) {col[rt] = 1, ef = true, V.clear(), ffl(rt);if (ef) {vector<int> lhs, rhs;for (int i : V) {lhs.push_back(w1[i] << 1 | ((col[i] == 1) ^ (col1[i] == 'R')));rhs.push_back(w2[i] << 1 | ((col[i] == 1) ^ (col2[i] == 'R')));}sort(lhs.begin(), lhs.end());sort(rhs.begin(), rhs.end());if (lhs != rhs) return 0;} else {vector<int> lhs, rhs;int cnt = 0;for (int i : V) {lhs.push_back(w1[i]);if (col1[i] == 'R') cnt ^= 1;rhs.push_back(w2[i]);if (col2[i] == 'R') cnt ^= 1;}sort(lhs.begin(), lhs.end());sort(rhs.begin(), rhs.end());if (lhs != rhs || cnt) return 0;}}return 1;
}
int main() {
#ifndef LOCAL
#ifdef NFfreopen("graph.in", "r", stdin);freopen("graph.out", "w", stdout);
#endifcin.tie(nullptr)->sync_with_stdio(false);
#endifint t;cin >> t;while (t--) cout << (mian() ? "YES" : "NO") << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/68740.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

CF131C题解

贪心,优先队列,CF 2200传送门:https://codeforces.com/problemset/problem/134/C 关注到题目的两个限制:1. 一个人只能与另外同一人交换一张卡牌。2. 一个人只能交换自己原来颜色的卡牌。 对于2条限制条件,显然有贪心思路:尽量让更多的人手持原有的卡牌。对于当前待交换的…

『模拟赛』多校A层冲刺NOIP2024模拟赛03

『模拟赛记录』多校A层冲刺NOIP2024模拟赛03Rank 炸了,触底反弹A. 五彩斑斓(colorful) 签,又没签上。 考虑如何一步步优化暴力。最暴力的思想 \(\mathcal{O(n^4)}\) 枚举每个矩形,判断四个顶点颜色。稍微优化些,两次 \(\mathcal{O(n^2)}\) 跑出对于行/列每个点下一个与之…

加装spark-3.5.3

集群版本 hadoop-3.4.0 hive-3.1.3 zookeeper-3.9.2 hbase-2.6.0(1.0.0以上需要zookeeper-3.4.0以上) spark-3.5.3(只能选2.13.0) scala-2.13.0(jdk8仅支持x.x.0系)总结一下:JDK8和scala-2.13.0必选。1.安装scala 1.1 下载解压 tar zxvf scala-2.13.0.tgz 1.2 配置环境变…

高级程序语言第二次个人作业

高级程序语言第二次作业这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/2024C/homework/13282学号 222200424姓名 赵伟豪编程练习3.13.23.33.43.53.63.73.8示例程序3.13.23.33.43.53.63.73.83.93.10总结与收获…

一起学RISC-V汇编第9讲之RISC-V ABI之栈帧

这一节讲解RISC-V中的栈帧。 1 C语言中的{}的秘密 函数执行的底层其实是操作寄存器,CPU的寄存器是有限的,为什么我们进行一系列函数调用后还能正确运行,这些函数之间是怎么协调使用寄存器的? 答案是:栈 函数之间能随意调用,还能顺利恢复现场,这个就是栈的功劳。为什么我…

浏览器的渲染原理

浏览器渲染原理 五个渲染流程Parse 阶段:解析 HTMLStyle 阶段:样式计算三个阶段:收集,划分和索引所有样式表中存在的样式规则 访问每个元素并找到适用于该元素的所有规则,CSS 引擎遍历 DOM 节点,进行选择器匹配,并且匹配的节点执行样式设置 结合层叠规则和其他信息为节点…

CSP2024 前集训:多校A层冲刺NOIP2024模拟赛03

前言T1 没想到正难则反,脑瘫了没敢用 bitset(复杂度擦边但卡常能过),T2 空间开大了挂了 \(100pts\),\(T3\) 是原。 T1 五彩斑斓部分分 \(20pts\):\(O(n^4)\) 暴力。部分分 \(20+?pts\):进行一些优化,极限数据下仍是 \(O(n^4)\)。部分分 \(60\sim 100pts\):bitset 优化…

在C#中使用适配器Adapter模式和扩展方法解决面向的对象设计问题

之前有阵子在业余时间拓展自己的一个游戏框架,结果在实现的过程中发现一个设计问题。这个游戏框架基于MonoGame实现,在MonoGame中,所有的材质渲染(Texture Rendering)都是通过SpriteBatch类来完成的。举个例子,假如希望在屏幕的某个地方显示一个图片材质(imageTexture)…