题意:给一个序列这个序列都是由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;
}

转载于:https://www.cnblogs.com/liuxin13/p/4669500.html

H - Parity game-poj1733(需要离散化)相关推荐

  1. 常用技巧 —— 离散化

    [概述] 离散化是数据结构中的一个常用技巧,其可以有效的降低时空复杂度,其基本思想就是在众多可能的情况中,只去考虑需要用到的值,通过离散化,可以改进低效的算法,甚至实现根本不可能实现的算法. 对于一些 ...

  2. 状态空间离散化matlab,现代控制理论:3.4g 线性连续系统状态空间模型的离散化...

    <现代控制理论:3.4g 线性连续系统状态空间模型的离散化>由会员分享,可在线阅读,更多相关<现代控制理论:3.4g 线性连续系统状态空间模型的离散化(24页珍藏版)>请在人人 ...

  3. 洛谷 - P4197 Peaks(Kruskal重构树+dfs序+主席树)

    题目链接:点击查看 题目大意:有 n 座山峰,每座山峰有他的高度 h[ i ] ,有些山峰之间有双向道路相连,共 m 条路径,每条路径有一个困难值,这个值越大表示越难走. 现在有 q 组询问,每组询问 ...

  4. IIR数字滤波器的设计及应用——MATLAB

    一.实验目的 (1)熟悉双线性变换法和双重映射法设计IIR数字滤波器的原理与方法. (2)掌握IIR数字滤波器的MATLAB实现方法设计各种滤波器. (3)观察分析滤波器输入输出数据波形,理解数字滤波 ...

  5. 机器学习笔记之狄利克雷过程(五)——基于狄利克雷过程的预测任务

    机器学习笔记之狄利克雷过程--基于狄利克雷过程的预测任务 引言 回顾:从概率图角度观察狄利克雷过程 关于随机测度 G \mathcal G G的后验概率分布 从指数族分布角度观察后验分布的性质 关于 ...

  6. LDPC译码原理(公式推导)及其matlab代码实现(超详细)

    目录 博文更改记录 一.背景概述 二.LDPC译码理论 2.1 LDPC码的表示方法 2.1.1LDPC码的矩阵表示 2.1.2 Tanner图表示 2.2符号说明 2.3LDPC译码算法 2.3.1 ...

  7. Telecoms Systems - PART.1

    在课程开始前我们先想几个问题,信号是怎么传输的,信号的传输过程是怎样的. "通过一定的介质将模拟信号或电信号进行传输" 那么这个过程中一定会有一些信号的损失而使得我们接受到的信息不 ...

  8. ACM巨全模板(上)

    柯氏模板(上) 柯氏模板(中) 柯氏模板(下) pdf下载 本模板博主还在完善ing-谢谢大家观看 数据结构: 1.RMQ (区间最值,区间出现最大次数,求区间gcd) 2.二维RMQ求区间最大值 ( ...

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

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

最新文章

  1. [推荐]Silverlight 2 开发者海报
  2. python【蓝桥杯vip练习题库】ADV-356字符串的操作
  3. 批量下载ABAP程序和表结构
  4. Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V
  5. OTT交付如何超越传统广电交付,为用户带来高质量视频网络——对话Synamedia流媒体技术发展经理卢彦林...
  6. 20151118小问题
  7. 湖南大学计算机与通信学院研究生,湖南大学计算机与通信学院2010年硕士研究生招生学科...
  8. python--17个新手常见Python运行时错误
  9. pwn环境搭建_[原创]CTF_Pwn环境搭建
  10. Linux登录时执行
  11. java多线程系类:JUC线程池:02之线程池原理(一)
  12. java中return提醒不兼容的_JAVA报return为不兼容类型
  13. ESP8266的AT指令集(基础 Wi-Fi)
  14. 在线编辑Word——插入公式
  15. 手游加速器:[求助]安卓端 手游变速器,类似光环助手的实现方式是怎样的?...
  16. 国外设计素材网址干货
  17. C语言wifi程序代码,STM32F103 WIFI程序 C语言.docx
  18. Python面试常见的30个问题及答案
  19. matlab多元回归分析怎么计算,第11讲_matlab多元回归分析
  20. Eclipse 导入maven项目报 Unknown Faceted Project Problem (Java Version Mismatch) 问题解决

热门文章

  1. 2022-2028年中国文化产业园投资分析及前景预测报告(全卷)
  2. Go 学习笔记(57)— Go 第三方库之 amqp (RabbitMQ 生产者、消费者整个流程)
  3. c语言中字符串数组的地址存放以及%s输出单个字符导致程序崩溃的问题
  4. bert-as-service使用
  5. 使用 Pytorch 实现 skip-gram 的 word2vec
  6. NNVM Compiler,AI框架的开放式编译器
  7. 使用Auto TensorCore CodeGen优化Matmul
  8. Recommenders with TensorRT
  9. 嵌入式Linux设备驱动程序:编写内核设备驱动程序
  10. 深度学习调参体验(一)