poj 1733 Parity game【哈希+并查集】

这道题题意我不想说了,但是有一个条件必须的说,就是1-2其实是0-2这条边,3-4是2-4这条边,但是困惑了好久,其他就是哈希给他一个地址 ,然后把注解看下方

#include <stdio.h>
#include <string.h>
#define  maxx 10001
int par[maxx];
int rank[maxx];
void init()
{
     for(int i=0;i<=maxx;i++)
     {
     	rank[i]=0;
     	par[i]=i;
     }
}
int findset(int n)
{
	if(n==par[n])
		return n;;
	int t =findset(par[n]);
	rank[n]=(rank[n]+rank[par[n]])%2;//判断父亲和儿子的奇偶性,并更新他们
     par[n]=t;
     return par[n];
}
int unite(int n,int m,int h)
{
	int pn=findset(n);
	int pm=findset(m);
	if(pn==pm)
	{
		if((rank[n]+rank[m]+h)%2==0)
			return 1;
		else
			return 0;
	}
    else
    {
    	par[pn]=pm;
    	rank[pn]=(rank[n]+rank[m]+h)%2;
    	return 1;
    }
}
int hash[maxx];
int aa=0;
int main ()
{
	int N;
	int M;
	scanf("%d",&N);
	init();
	scanf("%d",&M);
	int a,b;
	char s[10];
	int hh;
	int j;
	for(j=0;j<M;j++)
	{
		int px=0,py=0;
       scanf("%d%d%s",&a,&b,s);
       if(s[0]=='o')  hh=1;
       else    hh=0;
       a--;
       hash[0]=0;
       for(int i=0;i<=aa;i++)//用哈希给他们地址
       {
         if(hash[i]==a)
         {
         	px=i;
         	break;
         }
       }
       if(px==0&&a!=0)
       {
          aa++;
          hash[aa]=a;
          px=aa;
       }
       for(int i=0;i<=aa;i++)
       {
         if(hash[i]==b)
         {
         	py=i;
         	break;
         }
       }
       if(py==0&&b!=0)
       {
          aa++;
          hash[aa]=b;
          py=aa;
       }
       if(unite(px,py,hh)==0)  break;
  	}
    printf("%d\n",j);
}

poj 1733 Parity game【哈希+并查集】

时间: 2024-08-04 08:41:17

poj 1733 Parity game【哈希+并查集】的相关文章

poj 1733 Parity game 【种类并查集+离散化】

Parity game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6767   Accepted: 2616 Description Now and then you play the following game with your friend. Your friend writes down a sequence consisting of zeroes and ones. You choose a conti

Poj 1733 Parity Game(离散化+并查集)

 题目大意:给出n个数字,m个区间内的数字和的奇偶性,询问从哪句话开始出现错误. 1.对于给定区间[l , r]的奇偶性,可以转化为[1. l-1]和[1, r]的奇偶性"关系",这样就可以用带权并查集来做了,权值为当前结点与根节点的奇偶性关系,每次查询如果l,r根结点相同,那么判断这句话是否正确,如果根节点不同,那么合并. 2.由于这道题数据量很大,但是查询只有m(m<=5000)所以要先将数据离散化.对于离散化,有两种方法,一种是考虑元素大小相对关系的,一种是不需要考虑元

poj 1733 Parity game(种类并查集)

题意: 有0或1构成的一段区间总长度为n.m个询问,每次询问一段区间1的个数为奇数还是偶数,问从第一个询问開始,前几个询问正确的个数有几个: 思路: n<=10^9,m<=5000;非常多数用不到,所以能够离散化一下: 将和为奇数的区间标记为1,为偶数的区间标记为0. 对于每一个询问,合并操作时.假设两区间重合且奇偶性之和与询问所给的奇偶性同样,则该询问正确,否则错误: 若区间不重合.合并区间,并合并奇偶性: #include<cstdio> #include<cstring

POJ - 1733 Parity game 带权并查集+离散化

题目大意:有10E位数,每位上的数不是1就是0.现在给出第n位到第m位的1的数量的奇偶性,判断所给出的话有几句是对的 解题思路:有10E位数,肯定要离散化处理 因为有可能给出的区间是左端点等于右端点的,所以每次都把左端点的值减去1再进行处理 给出了区间的奇偶性,就要找一下是否和前面的矛盾,如果该区间的左端点的根节点和右端点的根节点是相同的,那么就可以判断是否正确了 如果根节点不同,就进行合并,合并时要注意判断是谁的根节点比较大 #include<cstdio> #include<algo

POJ 1773 Parity game 带权并查集

分析:带权并查集,就是维护一堆关系 然后就是带权并查集的三步 1:首先确定权值数组,sum[i]代表父节点到子节点之间的1的个数(当然路径压缩后代表到根节点的个数) 1代表是奇数个,0代表偶数个 2:设计路径压缩算法 sum[x]=(sum[x]+sum[t])%2; 3:弄清合并根节点时的操作,小的在上: 注:这个题需要离散化 #include <stdio.h> #include <string.h> #include <algorithm> using names

poj 1733 Parity game 并查集 离散化

点击打开链接题目链接 Parity game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6249   Accepted: 2413 Description Now and then you play the following game with your friend. Your friend writes down a sequence consisting of zeroes and ones. You cho

[2016-03-18][POJ][1733][Parity game]

时间:2016-03-18 09:55:52 星期五 题目编号:[2016-03-18][POJ][1733][Parity game] 题目大意:给定若干的区间范围内的数字的和,问从哪句开始是错误的 分析: 带权并查集 区间长度高达1000000000显然不可能直接建立数组,但是发现询问只有5000次,也就是最多出现了5000*2个点,离散化就可以解决问题 relation[i] i为区间的左端点,fa[i]为区间的右端点,relation[i]维护(i,fa[i])这段区间的和的奇偶状态,0

POJ 1984 Navigation Nightmare (数据结构-并查集)

Navigation Nightmare Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 4072   Accepted: 1615 Case Time Limit: 1000MS Description Farmer John's pastoral neighborhood has N farms (2 <= N <= 40,000), usually numbered/labeled 1..N. A series o

POJ 2236 Wireless Network ||POJ 1703 Find them, Catch them 并查集

POJ 2236 Wireless Network http://poj.org/problem?id=2236 题目大意: 给你N台损坏的电脑坐标,这些电脑只能与不超过距离d的电脑通信,但如果x和y均能C通信,则x和y可以通信.现在给出若干个操作, O p 代表修复编号为p的电脑 S p q代表询问p和q是不是能通信. 思路: 并查集即可.. 如果修复了一台电脑,则把与它相连距离不超过d的且修复了的放在一个集合里面. #include<cstdio> #include<cstring&