奇偶
【题目描述】
给定一个M格排成一行的储藏柜,每个格子能放一个物品;再给出N个条件,每个条件形同如下:A B odd/even,表示第A个格子到第B个格子之间(包括两端)放了奇数(odd)个物品或者偶数(even)个物品。
现在给出这N个条件,请你求出K,使得第1个条件到第K个条件全部能满足,而K+1不能满足。(K显然唯一)
【输入格式】
第一行一个整数M。
第二行一个整数N。
接下来N行,每行两个整数和一个字符串,Ai,Bi,odd/even。
【输出格式】
仅一行,表示答案,如果全部满足,那么输出条件总数。
【样例输入】
10
5
1 2 even
3 4 odd
5 6 even
1 6 even
7 10 odd
【样例输出】
3
【数据规模】
对于30%的数据: 0≤N≤10;1≤M≤10;
对于60%的数据: 0≤N≤500;1≤M≤5,000;
对于100%的数据:0≤N≤5,000;1≤M≤1,000,000,000;
并没有完全理解这道题。。。先抄代码了
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 5005
using namespace std;
char c[6];
int m,n,t;
int f[2*maxn],a[maxn*2],s[maxn*2],p[maxn],x[maxn],y[maxn];
int find(int x){
if (f[x]==x) return x;
s[x]=s[f[x]]^s[x];
return f[x]=find(f[x]);
}
void up(int k){
s[f[x[k]]]=s[x[k]]^p[k];
f[f[x[k]]]=y[k];
}
int main(){
cin>>m>>n;
for (int i=1;i<=n;i++)
{
scanf("%d%d%s",&x[i],&y[i],c);
if (c[0]=='o') p[i]=1;
x[i]--;
a[(i<<1)-1]=x[i];a[i<<1]=y[i];
}
sort(a+1,a+2*n+1);
t=unique(a+1,a+2*n+1)-a-1;
for (int i=1;i<=t;i++) f[i]=i;
for (int i=1;i<=n;i++){
x[i]=lower_bound(a+1,a+t+1,x[i])-a;
y[i]=lower_bound(a+1,a+t+1,y[i])-a;
if (find(x[i])==find(y[i])){
if ((s[x[i]]^s[y[i]])!=p[i])
{
cout<<i-1;return 0;
}
}
else up(i);
}
return 0;
}