首页 > 其他分享 >题解 QOJ1869【Power Station of Art】/ SS241006B【结论题】

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

时间:2024-10-07 20:00:27浏览次数:1  
标签:1000010 Art Power int 题解 rhs back lhs col

题解 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 NF
  freopen("graph.in", "r", stdin);
  freopen("graph.out", "w", stdout);
#endif
  cin.tie(nullptr)->sync_with_stdio(false);
#endif
  int t;
  cin >> t;
  while (t--) cout << (mian() ? "YES" : "NO") << endl;
  return 0;
}

标签:1000010,Art,Power,int,题解,rhs,back,lhs,col
From: https://www.cnblogs.com/caijianhong/p/18450541/solution-SS241006B

相关文章

  • CF131C题解
    传送门:https://codeforces.com/problemset/problem/134/C关注到题目的两个限制:1.一个人只能与另外同一人交换一张卡牌。2.一个人只能交换自己原来颜色的卡牌。对于2条限制条件,显然有贪心思路:尽量让更多的人手持原有的卡牌。对于当前待交换的卡牌,一种构造思路,我们每次贪心选取......
  • 伊吹萃香 题解
    题意(很复杂,真的不想概括,以下是原题面)在幻想乡,伊吹萃香是能够控制物体密度的鬼王。因为能够控制密度,所以萃香能够制造白洞和黑洞,并可以随时改变它们。某一天萃香闲着无聊,在妖怪之山上设置了一些白洞或黑洞,由于引力的影响,给妖怪们带来了很大的麻烦。于是他们决定找出一条消耗体力......
  • CF1117E Decypher the String题解
    传送门神奇的题。这是一道交互题。给定一个字符串\(s\),我们拥有若干操作,但是你不知道,第\(i\)个操作形如\(a_i,b_i\)表示交换字符串\(s\)中的第\(a_i\)位和\(a_j\)位。比如操作序列依次为\((1,2),(2,3)\),给定字符串为xyz。那么我们执行第一次操作后......
  • 题解 QOJ2559【Endless Road】/ SS241006D【套路题】
    PetrozavodskWinter2022.Day2.KAISTContest+KOITST2021XXIIOpenCupnamedafterE.V.Pankratiev,GrandPrixofDaejeon题目描述现在有\(10^9\)个花盆,依次编号为\(1,2,\dots,10^{9}\)。给定\(n\)个二元组\(L_i,R_i(L_i<R_i)\),我们将进行\(n\)次以下操......
  • CF722F Cyclic Cipher 题解
    传送门给定\(n\)个数列,第\(i\)个数列包含\(k_i\)个不超过\(m\)的互不相同的正整数(从\(1\)开始标号)。每一秒将每个数列中的数左移一个位置(即将每个数的下标\(-1\),下标\(1\)的数下标变为\(k_i\)),并记录由每个数列的第一个数组成的序列。\(10^{100}\)秒过......
  • [NOIP2023] 双序列拓展 题解
    qaq首先我们考虑其实这个条件就是要满足\(f\)严格比\(g\)大或\(f\)严格比\(g\)小。在这里只讨论大于。然后考虑到对于一个\(i\)如果不满足,我们可以把对应数组向右移一位看是否满足,如果还是不满足就无解了。考虑对于现在满足的\(i\),我们可以分别把两个指针向右移一......
  • abc370E Avoid K Partition
    有长度为N的数组A[i]和整数K,需要将A划分成连续子数组,要求每个子数组之和不能为K。问有多少种方案,答案对998244353取模。分析:如果不考虑和不为K的限制,就是个O(n^2)的dp,通过前缀和可以优化成O(n)。现要求子数组和不为K,可以用容斥思想先全部加上,然后减去不符合条件的。#include<bi......
  • ACT B414F Smart Toy
    ACTB414F(2024AutumnTerm)AssignmentDuedate:8November2024(Friday)Weighting:15%ofthetotalmarksforthiscourseThisisagroup-basedassignment.Studentshavetoform.theirgroups(amaximumofthreemembersinagroup).Pleasewritedownt......
  • EGOI2024 简单题解
    Day1T1InfiniteRace由于只有重复超过一个人才肯定是跑过一圈的,所以只用用一个数组做标记就可以了,每超过一次就打上标记,否则去掉标记。T2Bouquet定义\(dp[i]\)为,以第\(i\)种郁金香结尾的选法中最大可选的郁金香数量,易得状态转移方程为:\(dp[i]=max{dep[j]}+1(j<l_i\le......
  • Day 28 动态规划part01| LeetCode 509.斐波那契数,70.爬楼梯,746.使用最小花费爬楼梯
    理论基础包含题目类别:基础类(斐波那契、爬楼梯)、背包问题、打家劫舍、股票问题、子序列问题解题关键DP数组定义以及下标的含义递推公式DP数组如何初始化遍历顺序打印DP数组509.斐波那契数509.斐波那契数classSolution{publicintfib(intn){......