Parity game
题目
解析
一道题改了快3个小时(可能还要多)
蒟蒻
同样使用拓展域并查集,但是我们并不缺内存设成f(i)和f(i+n)时会发现两个域产生了重叠,怎么办呢?
+2*n
妙啊
然后,就AC了
居然在最优解上排到了前五,不可思议
注意:是从b连接到a-1
code:
#include<string>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
bool idigit(char x){
return (x<'0'|x>'9')?0:1;}
int n,l,xx,yy,f[30010];
struct node
{
int a,b;
}a[10010];
bool cmp1(node x,node y)
{
return x.a<y.a;
}
bool cmp2(node x,node y)
{
return x.b<y.b;
}
string x[5010];
int find(int dep)
{
if(f[dep]==dep)return dep;
return f[dep]=find(f[dep]);
}
void merge(int x,int y){
f[x]=y;}
inline int read()
{
int num=0,f=1;
char c=0;
while(!idigit(c=getchar())){
if(c=='-')f=-1;}
while(idigit(c))num=(num<<1)+(num<<3)+(c&15),c=getchar();
return num*f;
}
inline void write(int x)
{
int F[20];
int tmp=x?x:-x;
if(x<0)putchar('-');
int cnt=0;
while(tmp>0){
F[cnt++]=tmp%10+'0';tmp/=10;}
while(cnt>0)putchar(F[--cnt]);
}
int main()
{
read(),n=read();
for(int i=1;i<=n;i++)
{
a[(i<<1)-1].a=read(),a[i<<1].a=read(),a[(i<<1)-1].a--,a[(i<<1)-1].b=(i<<1)-1,a[i<<1].b=i<<1;
cin>>x[i];
}
sort(a+1,a+(n<<1)+1,cmp1);
for(int i=1;i<=(n<<1);i++)
{
if(a[i].a==l)a[i].a=a[i-1].a;
else l=a[i].a,a[i].a=a[i-1].a+1;
}
sort(a+1,a+(n<<1)+1,cmp2);
for(int i=1;i<=n;i++)f[i]=i;
for(int i=2*n;i<=3*n;i++)f[i]=i;//败家子
for(int i=1;i<=n;i++)
{
xx=a[(i<<1)-1].a,yy=a[i<<1].a;
if(x[i]=="odd")
{
if(find(xx)==find(yy)||find(xx+2*n)==find(yy+2*n))
{
if(i==1)printf("0");
else write(i-1);
return 0;
}
else merge(find(xx),find(yy+2*n)),merge(find(xx+2*n),find(yy));
}
else
{
if(find(xx+2*n)==find(yy)||find(xx)==find(yy+2*n))
{
if(i==1)printf("0");
else write(i-1);
return 0;
}
else merge(find(xx),find(yy)),merge(find(xx+2*n),find(yy+2*n));
}
}
; if(n==0)printf("0");
else write(n);//发现我的快输输出不了0
return 0;
}