依次给出若干段区间的奇偶描述, 描述不一定正确, 请找出第一条不正确的信息(和前面x条信息不冲突)。 输出x。
带权并查集裸题。 奇偶的变化可以通过异或运算来简化。 细节:由于区间跨度很大,需要离散化处理
//#include<bits/stdc++.h> #include<iostream> #include<algorithm> using namespace std; const int maxn=1e4+5; struct seg { int l,r,v; seg(){} seg(int L,int R,int V) { l=L;r=R;v=V; } }P[maxn]; int fa[maxn],val[maxn]; int num[maxn*2]; int findfa(int x) { if(fa[x]==x) return x; int t=fa[x]; fa[x]=findfa(fa[x]); val[x]^=val[t]; return fa[x]; } int main() { int n,m,i; cin>>n>>m; int cnt=0; for(int i=1;i<=m;i++) { int l,r,v; string s; cin>>l>>r>>s; l--; v=(s=="even")?0:1; P[i]=seg(l,r,v); num[++cnt]=l; num[++cnt]=r; } sort(num+1,num+1+cnt); int len=unique(num+1,num+cnt+1)-num; for(i=1;i<len;i++) { fa[i]=i;val[i]=0; //cout<<num[i]<<endl; } for(i=1;i<=m;i++) { int x=lower_bound(num+1,num+len,P[i].l)-num; int y=lower_bound(num+1,num+len,P[i].r)-num; int fx=findfa(x),fy=findfa(y); if(fx==fy && (val[x]^val[y])!=P[i].v) break; else if(fx!=fy) { fa[fx]=fy; val[fx]=val[x]^P[i].v^val[y]; } } cout<<i-1<<endl; return 0; }