codevs 2546奇偶游戏

奇偶
【题目描述】
给定一个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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值