首页 > 其他分享 >SS241006B. 结论题

SS241006B. 结论题

时间:2024-10-06 16:34:16浏览次数:1  
标签:结论 ch 颜色 int rep SS241006B vecs 终态

SS241006B. 结论题

题意

给你一个无向图,每个点有点权 \(1 \le a_i \le 10^6\) 和颜色 \(c_i=0/1\)。可以进行若干次操作:选择任意一条边,交换两个点的点权,如果两个点的颜色相同,两个点的颜色分别取反。给出初始状态和一个终态,判断是否存在到达终态的方案。

思路

真结论题。

这个操作非常恶心。巧妙地转化一下可以变成每次选定一条边,交换点权和颜色,然后对颜色取反。然后我们发现这个操作是可逆的。

考虑二分图怎么做。

首先原图可以分成若干个连通块分别做。

对于一个连通块,因为它是连通的,类似冒泡排序,所以点权是可以任意排序的,但是颜色还有取反操作。

对于二分图,一个左部的点如果换到了左部,颜色不变,换到了右部,颜色取反。

所以对于每个点,我们记录一个二元组 \((点权,点在左部时的颜色)\),对初态和终态都做这样的记录。如果初态和终态的元素相同,就一定有可行方案。对于初态的某个二元组和终态的某个二元组的一对匹配,如果在终态的原图,这个二元组在右部,那么初态的那个二元组也移到右部对应位置就行,这是可以一一匹配的。因为这是一个连通块,所以可以任意排序,因此结论成立。

对于非二分图的情况。结论是,初态点权和终态点权集合相同,且初态原图颜色 \(0\) 和终态原图颜色 \(0\) 的个数奇偶性相同(\(1\) 也一样)。必要性显然。下面证明其充分性。

首先我们在原图随便找一个生成二分图,比如找一个生成树。然后对每个点维护上面提到的二元组 \((点权,点在左部时的颜色)\)。由上面的结论可以知道,如果初态的二元组集合和终态相同,就一定有可行的方案。也就是说,在这个二分图上面我们可以任意排序这些二元组同时不改变它们的值。

原图就是二分图上加上了若干条边,如果在不同部加边(生成树奇数层和偶数层连边),图还是一个二分图,没有新的性质。如果在生成树奇数和奇数(或偶数和偶数)层连边,就出现了奇环。

类似冒泡排序,在这个奇环上所有点的点权可以任意排序,其实不需要再奇环上面排序,如果在二分图的路径上,不仅也可以任意排序,而且二元组的 \(点在左部的颜色\) 这个值还不会改变。现在证明之前那个结论的充分性。我们可以通过二分图上的路径把两个颜色相同的点放到非二分图的那条边的两个端点,然后交换它们,并取反颜色,这样某个颜色的总数就会 \(-2\) 了。而且我们只需要一个奇环,因为你可以把整棵生成树的点任意排序,把你想要改变颜色的点颜色取反。因此利用某一个奇环做若干次颜色取反,就可以使初态和终态二元组的集合相同了,然后由于二分图可以任意排序二元组,所以结论充分。

证毕。

code

#include<bits/stdc++.h>
//#define LOCAL
#define sf scanf
#define pf printf
#define rep(x,y,z) for(int x=y;x<=z;x++)
#define per(x,y,z) for(int x=y;x>=z;x--)
using namespace std;
typedef long long ll;
const int N=1e5+7;
template <typename T>
inline void read(T &x) {
	x=0;
	T fl=1;
	char ch=getchar();
	for(;!isdigit(ch);ch=getchar()) if(ch=='-') fl=-1;
	for(;isdigit(ch);ch=getchar()) x=(x<<3)+(x<<1)+ch-'0';
	x=x*fl;
}
template <typename T>
inline void write(T x,char ch) {
	static int st[10];
	int top=0;
	if(x<0) putchar('-'),x=-x;
	do {
		st[top++]=x%10;
		x/=10;
	}while(x);
	while(top) putchar(st[--top]+'0');
	putchar(ch);
}
int T,n,m;
vector<int> to[N];
int vi[N];
int u,v;
char ch[N];
typedef pair<int,int> pii;
#define fi first
#define se second
pii s[N],t[N];
bool checkeft(int &cs,int &ct,vector<pii> &vecs,vector<pii> &vect,int u) {
	bool ans=1;
	if(s[u].se) cs++;
	if(t[u].se) ct++;
	if(vi[u]==2) s[u].se^=1,t[u].se^=1;
	vecs.push_back(s[u]);vect.push_back(t[u]);
	for(int v:to[u]) {
		if(!vi[v]) vi[v]=(vi[u]==1?2:1),ans&=checkeft(cs,ct,vecs,vect,v);
		else if(vi[u]==vi[v]) ans=0;
	}
	return ans;
}
int main() {
	#ifdef LOCAL
	freopen("in.txt","r",stdin);
	freopen("my.out","w",stdout);
	#else
	freopen("graph.in","r",stdin);
	freopen("graph.out","w",stdout);
	#endif
	read(T);
	while(T--) {
		read(n),read(m);
		rep(i,1,m) {
			read(u),read(v);
			to[u].push_back(v),to[v].push_back(u);
		}
		rep(i,1,n) read(s[i].fi);
		sf("%s",ch+1);
		rep(i,1,n) s[i].se=(ch[i]=='R'?1:0);
		rep(i,1,n) read(t[i].fi);
		sf("%s",ch+1);
		rep(i,1,n) t[i].se=(ch[i]=='R'?1:0);
		bool ans=1;
		rep(k,1,n) {
			if(!ans) break;
			if(vi[k]) continue;
			vector<pii> vecs,vect;
			int cnts=0,cntt=0;
			vi[k]=1;
			bool check=checkeft(cnts,cntt,vecs,vect,k);
			sort(vecs.begin(),vecs.end());
			sort(vect.begin(),vect.end());
			if(check) {
				rep(i,0,(int)vecs.size()-1) {
					if(vecs[i]!=vect[i]) {
						ans=0;
						break;
					}
				}
			}else{
				if((cnts&1)!=(cntt&1)) ans=0;
				rep(i,0,(int)vecs.size()-1) {
					if(vecs[i].fi!=vect[i].fi) {
						ans=0;
						break;
					}
				}
			}
		}
		if(ans) pf("YES\n");
		else pf("NO\n");
		rep(i,1,n) to[i].clear(),vi[i]=0;
	}
}

标签:结论,ch,颜色,int,rep,SS241006B,vecs,终态
From: https://www.cnblogs.com/liyixin0514/p/18449045

相关文章

  • python3 SSLCertVerificationError 研究结论
    上一篇博客已经分析ssl流程,这次直接说报错的结果方法:对于pip3安装第三方包失败:1.建议直接退出代理charles2.命令行前输入: exportREQUESTS_CA_BUNDLE=~/Documents/charles-ssl-proxying-certificate.pem,然后执行pip3命令。 这个文件pem可以使用charles导出 如果需要......
  • 对oceans_of_stars的T3爆标做法的基础结论的证明
    我们要证明的结论如下:\(x\)在\([1,x-1]\)中选取父亲,以这种方法构造树,节点\(x\)在其子树大小为\(i\)时的方案数为\(\binom{n-i-1}{x-2}\)。对于组合数有一个众所周知的结论:\[C_n^m=C_n^{n-m}\]然后把上面的选式转化一下,得到:\(\binom{n-i-1}{n-i-x+1}\)。还是组合数......
  • 莫比乌斯反演常用结论
    符号规约\([A]\),艾弗森括号,其中\(A\)为命题,若\(A\)为真,则该式值为\(1\),否则为\(0\)。常见积性函数单位函数:\(\large{e(n)=[n=1]}\)幂函数:\(\large\operatorname{Id}_k(n)=n^k\)常数函数:\(\large{1(n)=1}\)因数个数:\(\large\operatorname{d}(n)=\sum\limits_{d\midn}1......
  • 业务初识-思考问题-分析数据-输出结论
    思考问题:确认问题(目的(明确程度,原因是解决还是什么),背景,思路)检测数据完善性拆解问题-经典分析框架-搭建自己的分析框架sg:拆解问题总结:一个原则四个方法MECE法则:拆解部分要相互独立、完全穷尽时间流程法、模型框架法、量化公式法、穷尽要素法时间流程法:最常用,根据时间......
  • 部分数论函数结论的证明
    从莫比乌斯反演的文章里迁移出来的。部分数论函数结论的证明前面的小节中,我们使用了一些数论函数相关的结论,但并未给出证明。接下来我们来证明它们。欧拉函数证明\[\varphi(ij)=\dfrac{\varphi(i)\varphi(j)\gcd(i,j)}{\varphi(\gcd(i,j))}\]由欧拉函数公式,设\(x......
  • 一些结论
    Prufer序列Prufer序列可以将一个带标号 n 个节点的树用 [1,n]中的 n−2 个整数表示,即 n 个点的完全图的生成树与长度为 n−2 值域为 [1,n] 的数列构成的双射。Cayley定理节点个数为n的无根标号树的个数为nn-2扩展Cayley定理1n个标号节点形成一个有s颗树的......
  • 山东大学计算机组成原理实验13控制器实验(含原理图,实验结果实物图,结论分析)
    实验内容及说明  目前控制器设计大都采用微程序设计方法,又称存储逻辑控制器。微程序控制器电路结构如图13-1所示。它由控制存储器CROM、微程序μPC计数器和微指令寄存器μIR构成。  其中,微程序计数μPC向控制存储器提供8位微地址,在控存读信号μRD‘的作用下,读出一条......
  • HT-018 Div3 构造 题解 [ 黄 ] [ 数学 ] [ 结论 ]
    构造:结论题,gcy数竞大佬tql%%%orz。结论先放结论:如果\(x\bmod4=2\),那么\(x\)无法被表示为\(a^2-b^2\)的形式;除此之外的其他数都可以。证明对\(a^2-b^2\)因式分解,得\(x=(a+b)(a-b)\)。当\(x\bmod2=1\)时包含\(x\bmod4=1\)和\(x\bmod4=3\)的情况。......
  • 【MySQL】事务 【上】{事务的版本支持 事务提交方式 实验结论 用户问题 如何理解隔离
    文章目录1.引入事务事务的版本支持事务提交方式实验结论用户问题2.隔离性如何理解隔离性隔离级别查看与设置隔离性4.四种隔离级别的场景读未提交读已提交可重复读串行化1.引入事务当客户端A检查还有一张票时,将票卖掉,还没有执行更新数据库的时候,客户端B检查了票数......
  • 期刊论文中的结果、讨论、结论三者的区别是什么,他们三个在撰写的时候分别应该包含哪些
    问题描述:期刊论文中的结果、讨论、结论三者的区别是什么,他们三个在撰写的时候分别应该包含哪些内容?问题解答:在期刊论文中,结果(Results)、讨论(Discussion)和结论(Conclusion)是非常重要的部分,它们各自有明确的写作目的和内容要求。以下是对这三部分的详细解释及其区别:结果(Results......