SSL_1227&&P5937【Parity game】

Parity game

题目

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;
}

猜你喜欢

转载自blog.csdn.net/zhanglili1597895/article/details/113025950