博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 1733 Parity game
阅读量:4963 次
发布时间:2019-06-12

本文共 2061 字,大约阅读时间需要 6 分钟。

思路: 带权并查集

分析:
1 题目给定n个条件,要我们找到第一个不满足条件的编号
2 每一个条件给的是区间[l,r]的1的奇偶数,很明显[l,r]这个区间的1的个数可以由[0,r]-[0,l-1]得来
3 那么我们利用并查集的思想,rank[x]表示的是x到跟节点这个区间即[x,father[x]]这个区间的1的个数,那么奇偶性可以由1和0来表示
4 题目还有一个难点就是要离散化,一般的离散化的步骤是排序+去重,然后找的时候利用二分即可
代码:

 

#include
#include
#include
#include
using namespace std;const int MAXN = 50010;struct Node{ int x; int y; int mark; };Node node[MAXN];int arr[MAXN] , pos;int father[MAXN] , rank[MAXN] , num;void init(){ sort(arr , arr+pos); num = unique(arr , arr+pos)-arr; memset(rank , 0 , sizeof(rank)); for(int i = 0 ; i <= num ; i++) father[i] = i;}int find(int x){ if(father[x] != x){ int fa = father[x]; father[x] = find(father[x]); rank[x] = (rank[x]+rank[fa])%2; } return father[x];}int search(int x){ int left = 0; int right = num-1; while(left <= right){ int mid = (left+right)>>1; if(arr[mid] == x) return mid; else if(arr[mid] < x) left = mid+1; else right = mid-1; }}int solve(int n){ for(int i = 0 ; i < n ; i++){ int x = search(node[i].x)+1; int y = search(node[i].y)+1; int fx = find(x); int fy = find(y); int val = node[i].mark; if(fx == fy){ if((rank[y]-rank[x]+2)%2 != val) return i; } else{ father[fx] = fy; rank[fx] = (val+rank[y]-rank[x]+2)%2; } } return n;}int main(){ int len , n; char str[10]; while(scanf("%d%d" , &len , &n) != EOF){ pos = 0; for(int i = 0 ; i < n ; i++){ scanf("%d %d %s" , &node[i].x , &node[i].y , str); node[i].x--; arr[pos++] = node[i].x; arr[pos++] = node[i].y; if(str[0] == 'e') node[i].mark = 0; else node[i].mark = 1; } init(); printf("%d\n" , solve(n)); } return 0;}

 

 

转载于:https://www.cnblogs.com/jiangu66/p/3243708.html

你可能感兴趣的文章
java if 用法详解_Java编程中的条件判断之if语句的用法详解
查看>>
kafka的java客户端_KAFKA Producer java客户端示例
查看>>
java -f_java学习笔记(一)
查看>>
java 什么题目好做_用java做这些题目
查看>>
java中的合同打印_比较方法违反了Java 7中的一般合同
查看>>
php 位运算与权限,怎么在PHP中使用位运算对网站的权限进行管理
查看>>
php include效率,php include类文件超时
查看>>
matlab sin函数 fft,matlab的fft函数的使用教程
查看>>
wcdma下行如何解扩解扰 matlab,WCDMA技术基础.ppt
查看>>
MySQL date_format() 函数
查看>>
mysql 时间处理
查看>>
mysql adddate()函数
查看>>
mysql addtime() 函数
查看>>
mysql 根据日期时间查询数据
查看>>
mysql 创建时间字段
查看>>
mysql 生成随机数rand()
查看>>
mysql e的n次幂exp()
查看>>
mysql sin() 函数
查看>>
mysql upper() 函数
查看>>
mysql 子查询
查看>>