codevs 2546奇偶游戏

来源:互联网 发布:社区下单系统源码 编辑:程序博客网 时间:2024/06/15 14:53

奇偶
【题目描述】
给定一个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 5005using 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;}
原创粉丝点击