题目大意是:一个由0,1组成的数字串~~,现在你问一个人,第i位到第j位的1的个数为奇数还是偶数。一共会告诉你几组这样的数

要你判断前k组这个人回答的都是正确的,到第k+1组,这个人说的是错的,要你输出这个k,要是这个人回答的都是正确的,则输出组数

odd为奇数,even为偶数。

Sample Input

10
5
1 2 even
3 4 odd
5 6 even
1 6 even
7 10 odd

Sample Output

3

思路:赤裸裸的种类并查集吧.......其中,我们把一段区间为奇数标记为0,为偶数标记为1,然后如果区间连贯,也就是说区间1到区间2,区间3到区间4,那么就是可以连贯成区间1到区间4的,如此的话,可以是左极限-1,或者右极限+1......判断是否在同一个树上,在的话,判断是否正确,不在的话,连接起来,在连接的时候,按照种类并查集的操作即可.......

ac代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int father[50005],rank[50005],ans=0;
struct node
{
int v1,v2;
char ch[10];
int num;
} s[50005];
int t[50005],flag;
int cmp(const node a,const node b)
{
if(a.num<b.num)
return 1;
else
return 0;
}
int find(int x)
{
if(x==father[x])
return x;
int tmp=father[x];
father[x]=find(tmp);
rank[x]=(rank[x]+rank[tmp])%2;
return father[x];
}
void liantong(int x,int y,int k)
{
int xx=find(x);
int yy=find(y);
if(xx==yy)
{
int sum=(2-rank[x]+rank[y])%2;
if(sum!=k)
flag=0;
// return;
}
if(xx>yy)
{
father[xx]=yy;
rank[xx]=(2-k+2-rank[x]+rank[y])%2;
}
if(xx<yy)
{
father[yy]=xx;
rank[yy]=(2-k+2-rank[y]+rank[x])%2;
}
//printf("%d %d %d %d %d\n",x,y,rank[x],rank[y],k);
}
int erfen(int ll,int rr,int k)
{
while(ll<=rr)
{
int mid=(ll+rr)/2;
if(t[mid]>k)
rr=mid-1;
else
ll=mid+1;
}
return rr;
}
int main()
{
int n,m;
while(scanf("%d",&n)>0)
{
if(n==-1)
break;
scanf("%d",&m); for(int i=0; i<=20005; i++)
{
father[i]=i;
rank[i]=0;
}
/*if(m==0)
{
printf("0\n");
return 0;
}*/
int cnt=0;
for(int i=0; i<m; i++)
{
s[i].num=i;
scanf("%d%d%s",&s[i].v1,&s[i].v2,s[i].ch);
t[cnt++]=s[i].v1;
t[cnt++]=s[i].v2;
}
sort(t,t+cnt);
int cnt1=1; for(int i=1; i<cnt; i++)
if(t[i]!=t[i-1]) t[cnt1++]=t[i]; for(int i=cnt1-1; i>0; i--)
if(t[i]!=t[i-1]+1) t[cnt1++]=t[i-1]+1;
sort(t,t+cnt1);
for(int i=cnt1; i>0; i--)
t[i]=t[i-1];
//for(int i=1; i<=cnt1; i++)
// printf("%d\t",t[i]);
int ans=m;
flag=1;
for(int i=0; i<m; i++)
{
int x=erfen(1,cnt1,s[i].v1);
int y=erfen(1,cnt1,s[i].v2);
if(s[i].ch[0]=='e')
liantong(x-1,y,0);
else
liantong(x-1,y,1);
if(flag==0)
{
ans=i;
break;
}
}
//for(int i=0;i<=n;i++)
//printf("%d\n",rank[i]);
printf("%d\n",ans); }
return 0;
}
/*
3
3
1 2 odd
2 3 odd
1 3 even
*/

poj1733(区间上的种类并查集)的更多相关文章

  1. 类似区间计数的种类并查集两题--HDU 3038 & POJ 1733

    1.POJ 1733 Parity game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5744   Accepted: ...

  2. POJ1733 Parity game —— 种类并查集

    题目链接:http://poj.org/problem?id=1733 Parity game Time Limit: 1000MS   Memory Limit: 65536K Total Subm ...

  3. poj1733(种类并查集+离散化)

    题目链接: http://poj.org/problem?id=1733 题意: 输入n表示有一个长度为n的0,1字符串, m表示接下来有m行输入, 接下来的m行输入中x, y, even表示第x到第 ...

  4. 并查集例题01. 种类并查集(poj1733)

    题目: http://poj.org/problem?id=1733 题意: 输入n表示有一个长度为n的0,1字符串, m表示接下来有m行输入, 接下来的m行输入中x, y, even表示第x到第y个 ...

  5. hdu 3038 How Many Answers Are Wrong(种类并查集)2009 Multi-University Training Contest 13

    了解了种类并查集,同时还知道了一个小技巧,这道题就比较容易了. 其实这是我碰到的第一道种类并查集,实在不会,只好看着别人的代码写.最后半懂不懂的写完了.然后又和别人的代码进行比较,还是不懂,但还是交了 ...

  6. HDU3038【种类并查集】

    题意: 给出m组区间[a,b],以及其区间的和,问有矛盾的有几组: 思路: 种类并查集. 主要是几个关系:同类元素的关系,父亲与儿子的关系,不同类元素的关系: 我们可以类似看作一个前缀和,sum[x] ...

  7. NOI2001|POJ1182食物链[种类并查集 向量]

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 65430   Accepted: 19283 Description ...

  8. NOIP2010关押罪犯[并查集|二分答案+二分图染色 | 种类并查集]

    题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示 ...

  9. pku 1703(种类并查集)

    题目链接:http://poj.org/problem?id=1703 思路;个人觉得本质上还是和带权并查集一样的,只不过多了一个MOD操作,然后就是向量关系图稍微改动一下就变成种类并查集了,对于本题 ...

随机推荐

  1. zabbix3.0 安装时出现PHP Parse error: syntax error

    httpd的错误日志 [Sun Mar :: ] [error] [client 由于系统yum默认安装的php版本是5.3.3 zabbix 3.0支持的平台,只支持php5.4以上的版本https ...

  2. 测试Js权限

    '12222' 测试一下 刚兴趣的可以参考: http://www.cnblogs.com/littledu/archive/2011/05/08/2040298.html http://www.cn ...

  3. Installation error: INSTALL_FAILED_CONFLICTING_PROVIDER 解决方案

    主要是由于调试的环境中已有一个同名的Provider存在. 解决方法是修改AndroidManifest.xml中的 <provider android:name=".apps.App ...

  4. 带你开发一款给Apk中自己主动注入代码工具icodetools(开凿篇)

    一.前言 从这篇開始咋们開始一个全新的静态方式逆向工具icodetools的实现过程.这个也是我自己第一次写的个人认为比較实用的小工具,特别是在静态方式逆向apk找关键点的时候.兴许会分为三篇来具体介 ...

  5. (面试题)html中创建模态窗口的方法有哪些?

    一.创建模态和非模态对话框除了alert(""); confirm(""); prompt("");之外还有创建模态对话框:vReturnV ...

  6. flock防止crontab脚本周期内未执行完重复执行(转)

    如果某脚本要运行30分钟,可以在Crontab里把脚本间隔设为至少一小时来避免冲突.而比较糟的情况是可能该脚本在执行周期内没有完成,接着第二个脚本又开始运行了.如何确保只有一个脚本实例运行呢?一个好用 ...

  7. marquee标签详解

    <marquee>标签,它是成对出现的标签,首标签<marquee>和尾标签</marquee>之间的内容就是滚动内容.<marquee>标签的属性主要 ...

  8. Jacobi并行拆解

    作者:桂. 时间:2018-04-23  21:12:02 链接:http://www.cnblogs.com/xingshansi/p/8921815.html 前言 本文主要是复数矩阵分解的拆解思 ...

  9. Windows搭建测试RabbitMq遇到的问题

    报错: d:\Program Files\RabbitMQ Server\rabbitmq_server-3.6.5\sbin>rabbitmq-plugins eble rabbitmq_ma ...

  10. php分享十三:mysql事物

    一:事物的隔离级别 1:隔离级别的类型 SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的: Read Uncommitted(读取未提交内容) Re ...