题意:给一个序列这个序列都是由0和1组成,现在随意拿出来一个序列,然后说出他的和是奇数还是偶数,因为有可能存在假话,让你判断前多少条没有假话,也就是查找第一个假话的位置-1

//////////////////////////////////////////////////
这道题很像D题,都是线段区间,不过数据比较大,需要离散化一下。
#include <stdio.h>
#include<algorithm>
using namespace std; const int maxn = 100005; int f[maxn], val[maxn];//val记录区间奇偶值
int p[maxn];//p数组保存需要离散化的数据 struct node{int u, v, sum;}a[maxn];//保存输入 int Find(int x)
{
    int k = f[x];     if(f[x] != x)
    {
        f[x] = Find(f[x]);
        val[x] = (val[x]+val[k])%2;
    }     return f[x];
} int main()
{
    int N;     while(scanf("%d", &N) != EOF)
    {
        int i, M, k=0;
        char s[10];         scanf("%d", &M);         for(i=0; i<M; i++)
        {
            scanf("%d%d%s", &a[i].u, &a[i].v, s);
            a[i].sum = (s[0] == 'e' ? 0 : 1);
            //为防止不在两个不相邻的数离散化后相邻,在他们中间加一个数
            p[k++] = a[i].u, p[k++] = a[i].u-1;
            p[k++] = a[i].v, p[k++] = a[i].v-1;
        }
        p[k++] = N, p[k++] = N-1;
        sort(p, p+k);
        N = unique(p, p+k) - p;//去重复函数         for(i=0; i<N; i++)
            f[i] = i, val[i] = 0;         for(i=0; i<M; i++)
        {
            int u = lower_bound(p, p+N, a[i].u-1) - p;//二分查询
            int v = lower_bound(p, p+N, a[i].v) - p;             int ru = Find(u), rv = Find(v);             if(ru == rv && (val[u]+a[i].sum)%2 != val[v])
                break;
            if(ru < rv)
            {
                f[rv] = ru;
                val[rv] = (val[u]+a[i].sum-val[v]+2)%2;
            }
            else if(ru > rv)
            {
                f[ru] = rv;
                val[ru] = (val[v]-a[i].sum-val[u]+2)%2;//注意别写错val里面的参数
            }
        }         printf("%d\n", i);
    }     return 0;
}

H - Parity game-poj1733(需要离散化)的更多相关文章

  1. H - Parity game 并查集

    Now and then you play the following game with your friend. Your friend writes down a sequence consis ...

  2. HDU 4417 Super Mario(主席树求区间内的区间查询+离散化)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  3. POJ1177 Picture —— 求矩形并的周长 线段树 + 扫描线 + 离散化

    题目链接:https://vjudge.net/problem/POJ-1177 A number of rectangular posters, photographs and other pict ...

  4. HDU1542 Atlantis —— 求矩形面积并 线段树 + 扫描线 + 离散化

    题目链接:https://vjudge.net/problem/HDU-1542 There are several ancient Greek texts that contain descript ...

  5. poj2482

    (题外话:这题这是ACMer的福利啊……)我非常不擅长做矩形类的数据结构一般来说,二维的问题我们要转化为一维来考虑感觉一般的手法是对一维排序,并且线性扫描这一维,然后用各种数据结构维护另一维上的最优值 ...

  6. [题目] luogu P2061 [USACO07OPEN]城市的地平线City Horizon

    算法 线段树 + 离散化 思路 对\((x,y,h)\)的左右端点\(x,y\)进行离散化,离散化前的原值记为\(val[i]\),对每个矩形按高度\(h\)从小到大排序. 设离散化后的端点有\(M\ ...

  7. 【BZOJ3524】Couriers(主席树)

    题意:给一个长度为n的序列a.1≤a[i]≤n.m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. n,m≤5000 ...

  8. POJ1733:Parity Game(离散化+带权并查集)

    Parity Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12853   Accepted: 4957 题目链接 ...

  9. [POJ1733]Parity game(并查集 + 离散化)

    传送门 题意:有一个长度已知的01串,给出[l,r]这个区间中的1是奇数个还是偶数个,给出一系列语句问前几个是正确的 思路:如果我们知道[1,2][3,4][5,6]区间的信息,我们可以求出[1,6] ...

随机推荐

  1. DATEDIFF interval=ms的用法

    datediff(ms,@CurrDateTime,@Date)>0 当上面的日期超过24天,用上面的sql会有问题 要修改成如下: (CONVERT(VARCHAR,@CurrDateTime ...

  2. IOS开发网络篇之──ASIHTTPRequest详解

    目录 目录 发起一个同步请求 创建一个异步请求 队列请求 请求队列上下文 ASINetworkQueues, 它的delegate提供更为丰富的功能 取消异步请求 安全的内存回收建议 向服务器端上传数 ...

  3. 由App的启动说起(转)

    The two most important days in your life are the day you are born and the day you find out why. -- M ...

  4. VirtualBox 中的UBUNTU和java环境的配置以及各种常用说明

    本来是要ubuntu下学习C++的,但是又懒的用高手们推荐的各种记事本级的操作,所以要用IDE.(我用IDE我自豪,人类的进化就是建立在工具的使用这个基础之上的.)我选用了oracle的netbean ...

  5. SGU 155.Cartesian Tree

    时间限制:0.25s 空间限制:6M 题意: 给出n(n< 50000)个含双关键字(key,val)的节点,构造一颗树使该树,按key值是一颗二分查找树,按val值是一个小根堆. Soluti ...

  6. SGU 164.Airline(结论题)

    时间限制:0.25s 空间限制:4M 题意: 在n(1<=n<=200)个点的无向完全图中,有m种不同的边.现在从中选择不超过(m+1)/2种边,使得任意两点可以通过不超过3条边互相到达. ...

  7. 用PHP添加购物商品

    <?php session_start(); header ( "Content-type: text/html; charset=UTF-8" ); //设置文件编码格式 ...

  8. css杂项,清除浮动

    在写HTML代码的时候,发现在Firefox等符合W3C标准的浏览器中,如果有一个DIV作为外部容器,内部的DIV如果设置了float样式,则外部的容器DIV因为内部没有clear,导致不能被撑开.看 ...

  9. postgresql 多实例运行

    创建新的实例, (下面所用到的9.1版本,如果为其他版本,可以用版本号替换9.1) sudo /usr/bin/pg_createcluster -U postgres                 ...

  10. test about cnblog

    there is nothing here. This is only a test about cnblog!