zoukankan      html  css  js  c++  java
  • poj1733 Parity game

    好神的题啊

    首先在意识上差分,那么条件就变成了x-1和y的奇偶性异同

    现在就像是程序分析那题了

    但是要输出哪里开始不对

    神的是用带权并查集,假如相同设为0,不同设为1,那么同一并查集内的点通过异或运算就可以确定奇偶性的关系了

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    
    int m;
    struct node{int x,y,o;}a[11000];
    
    int lslen,ls[21000];
    void LSH()
    {
        for(int i=1;i<=m;i++)
            ls[++lslen]=a[i].x, ls[++lslen]=a[i].y;
        sort(ls+1,ls+lslen+1);
        
        lslen=unique(ls+1,ls+lslen+1)-ls-1;
        for(int i=1;i<=m;i++)
        {
            a[i].x=lower_bound(ls+1,ls+lslen+1,a[i].x)-ls;
            a[i].y=lower_bound(ls+1,ls+lslen+1,a[i].y)-ls;
        }
    }
    
    int fa[110000],d[110000];
    int findfa(int x)
    {
        if(fa[x]==x)return x;
        int f=findfa(fa[x]);
        d[x]^=d[fa[x]];fa[x]=f;
        return fa[x];
    }
    
    char ss[5];
    int main()
    {
        int n;
        scanf("%d%d",&n,&m);
        
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d%s",&a[i].x,&a[i].y,ss+1);
            if(ss[1]=='o')a[i].o=1;
            else a[i].o=0;
        }
        LSH();
        
        for(int i=0;i<=100000;i++)fa[i]=i,d[i]=0;
        
        for(int i=1;i<=n;i++)
        {
            int x=a[i].x-1,y=a[i].y;
            int fx=findfa(x),fy=findfa(y);
            if(fx!=fy)
            {
                fa[fx]=fy;
                d[fx]=d[x]^d[y]^a[i].o;
            }
            else if(d[x]^d[y]!=a[i].o){printf("%d
    ",i-1);return 0;}
        }
        printf("%d
    ",m);
        return 0;
    }
  • 相关阅读:
    iOS 快语句(block)浅析
    iOS中控制器的创建
    iOS中的截屏
    iOS&UITextView中的placeholder属性
    iOS归档,解档
    iOS内存警告浅析
    scrollWidth,clientWidth,offsetWidth的区别
    css3学习笔记
    页面重构的常用规范
    页面重构的职业定位
  • 原文地址:https://www.cnblogs.com/AKCqhzdy/p/9416114.html
Copyright © 2011-2022 走看看