2019 UESTC ACM Training for Data Structures[K](并查集解决条件冲突问题)

题目大意:现在给你一个n长度的串,然后n次询问及回答,在第x至第y位中元素的和 是奇数或是偶数。问从哪一次开始,下一次的回答与之前的是矛盾的。也就是找第一次与前面的条件发冲突的条件,其中 even为偶数 odd为奇数

带权并查集和dp。如果L-R的和为偶数,即可看作区间内有偶数个1,其他的都为零。如果L-R的和为奇数,即可看作区间内有奇数个1,其他的都为零。
因此我们用前缀和val[i]表示前i个数的奇偶情况。val[i]=0和1分别对应前i个数的和为偶数和奇数的情况。
进行分析:
对于1-i个数,1<=j<=i,如果i-j为偶数个1,那么val[i]=val[j-1] (即同奇偶性),即val[j-1]^val[i]=0
如果i~j为奇数个1,那么val[i]!=val[j-1] (即相反奇偶性),即val[j-1]^val[i]=1
当当前区间能和之前区间组成连续区间的时候要进行合并,并且维护节点权值,因此用带权并查集。
当当前区间已经加入集合,就判断是否和之前的条件相悖

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
#define LL long long
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=1e6+5;
int n,m,num,fa[maxn],val[maxn];
char inp[10];
int getfa(int x){
	if(x!=fa[x]){
		int t=getfa(fa[x]);
		val[x]^=val[fa[x]];
		return fa[x]=t;
	}
	return fa[x];
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)fa[i]=i;
	for(int i=1;i<=m;i++){
		int x,y;
		scanf("%d%d%s",&x,&y,inp);
		x--;
		num= inp[0]=='o';
	//	cout<<x<<" "<<y<<" "<<num<<"~~~~~~~~~~~~~~~~~"<<endl;
		int fx=getfa(x),fy=getfa(y);
		if(fx!=fy)fa[fy]=fx,val[fy]=val[y]^val[x]^num;
		else if((val[x]^val[y])!=num){
			printf("%d",i-1);
			return 0;
		}
	}
	puts("ORZQHQH");
	
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
互联网络程序设计是指在互联网上进行程序开发和设计的过程。UESTC则是我国的一所著名高校——电子科技大学。 互联网络程序设计 uestc包含了两个主要的方面:互联网络和程序设计。互联网络是指将多个计算机网络通过通信链路互相连接起来,实现信息共享和资源共享的网络系统。程序设计是指根据需求和目标,通过编写代码和设计算法,实现计算机程序的过程。 互联网络程序设计 uestc的学习内容主要包括以下几个方面: 1. 网络知识:学习互联网络的基本概念、原理和协议,如TCP/IP协议、HTTP协议等。掌握网络编程的基本技术,能够编写网络应用程序。 2. 数据通信:学习数据通信的基本原理和技术,包括数据传输的方式、数据压缩和加密等。了解网络安全和数据保护的基本知识。 3. 程序设计:学习编程语言和开发工具,如Java、C++和Python等。掌握常用的编程技巧和方法,能够设计和实现复杂的网络应用程序。 4. Web开发:学习Web开发的基本知识和技术,包括HTML、CSS、JavaScript等。能够设计和实现交互式的Web应用程序。 5. 数据库技术:学习数据库的基本原理和技术,如SQL语言和数据库管理系统。能够设计和管理数据库,实现数据的存储和检索。 通过学习互联网络程序设计 uestc,可以掌握互联网应用开发的基本技能,具备设计和实现网络应用程序的能力。这对于目前互联网行业的人才需求来说是非常重要的,也为学生提供了广阔的就业和创业机会。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值