题目描述

    LYK在玩猜数字游戏。
   总共有n个互不相同的正整数,LYK每次猜一段区间的最小值。形如[li,ri]这段区间的数字的最小值一定等于xi。
    我们总能构造出一种方案使得LYK满意。直到…… LYK自己猜的就是矛盾的!
    例如LYK猜[1,3]的最小值是2,[1,4]的最小值是3,这显然就是矛盾的。
    你需要告诉LYK,它第几次猜数字开始就已经矛盾了。
 

输入

    第一行两个数n和T,表示有n个数字,LYK猜了T次。
    接下来T行,每行三个数分别表示li,ri和xi。
 

输出

输出一个数表示第几次开始出现矛盾,如果一直没出现矛盾输出T+1。

样例输入

20 4
1 10 7
5 19 7
3 12 8
1 20 1

样例输出

3

提示

数据范围
对于50%的数据n<=8,T<=10。
 
对于80%的数据n<=1000,T<=1000。
对于100%的数据1<=n,T<=1000000,1<=li<=ri<=n,1<=xi<=n(但并不保证一开始的所有数都是1~n的)
 
Hint
 
建议使用读入优化
inline int read()
{
       int x = 0, f = 1;
 
       char ch = getchar();
       for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
 
       for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';
 
       return x * f;
 
}

题解

这道题我们先考虑矛盾的情况

我们不难发现有以下两种情况是矛盾的

1.当一个区间覆盖了另一个区间且大的区间的x值比另一个区间的x值小的时候是矛盾的

2.当两个区间的x值相同时,如果这两个区间没有交集,这也是矛盾的

知道了矛盾的情况后

我们可以二分矛盾的句子的位置

将前k个句子按x值从大到小排个序,然后我们枚举,判断当前区间的x值和前一个区间的x值是否相同

如果相同,就判断一下有没有交集

如果不相同,我们可以维护一个线段树,将交集的区间覆盖为1,查询并集的区间是否被覆盖为1,当然我们也可以用并查集来维护,我是用并查集来做的,但还是感觉线段树应该好懂一些(虽然代码长了些)

 #include<bits/stdc++.h>
#define N 1000005
using namespace std;
int n,T,cnt;
int fa[N];
struct node{
int l,r,x;
}a[N],b[N];
bool cmp(node x,node y){ return x.x>y.x; }
int find(int x){ if (x!=fa[x]) fa[x]=find(fa[x]); return fa[x]; }
bool check(int x){
int f1,f2;
for (int i=;i<=n+;i++) fa[i]=i;
for (int i=;i<=x;i++) b[i]=a[i];
sort(b+,b++x,cmp);
int lmin=b[].l,lmax=b[].l,rmin=b[].r,rmax=b[].r;
for (int i=;i<=x;i++){
if (b[i].x<b[i-].x){
f1=find(lmax);
if (f1>rmin) return true;//判断是否有大于b[i].x的区间覆盖了
f2=find(rmax+);
for (int j=find(lmin);j<=rmax;j++){
f1=find(j);
fa[f1]=f2;
}
lmin=lmax=b[i].l;
rmin=rmax=b[i].r;
} else{
lmin=min(lmin,b[i].l);
lmax=max(lmax,b[i].l);
rmin=min(rmin,b[i].r);
rmax=max(rmax,b[i].r);
if (lmax>rmin) return true;//判断是否有交集
}
}
f1=find(lmax);
if (f1>rmin) return true;
return false;
}
int main(){
scanf("%d%d",&n,&T);
for (int i=;i<=T;i++)
scanf("%d%d%d",&a[i].l,&a[i].r,&a[i].x);
int l=,r=T;
int ans=T+;
while (l<=r){
int mid=(l+r)>>;
if (check(mid)){
ans=mid;
r=mid-;
} else l=mid+;
}
printf("%d\n",ans);
return ;
}

YYHS-猜数字(并查集/线段树维护)的更多相关文章

  1. UVA1455 - Kingdom(并查集 + 线段树)

    UVA1455 - Kingdom(并查集 + 线段树) 题目链接 题目大意:一个平面内,给你n个整数点,两种类型的操作:road x y 把city x 和city y连接起来,line fnum ...

  2. 并查集&线段树&树状数组&排序二叉树

    超级无敌巨牛逼并查集(带权并查集)https://vjudge.net/problem/UVALive-4487 带删点的加权并查集 https://vjudge.net/problem/UVA-11 ...

  3. 【Codeforces576E_CF576E】Painting Edges(可撤销并查集+线段树分治)

    题目 CF576E 分析: 从前天早上肝到明天早上qwq其实颓了一上午MC ,自己瞎yy然后1A,写篇博客庆祝一下. 首先做这题之前推荐一道很相似的题:[BZOJ4025]二分图(可撤销并查集+线段树 ...

  4. BZOJ 3910 并查集+线段树合并

    思路: 1. 并查集+线段树合并 记得f[LCA]==LCA的时候 f[LCA]=fa[LCA] 2.LCT(并不会写啊...) //By SiriusRen #include <cstdio& ...

  5. luogu5012 水の数列 (并查集+线段树)

    如果我们能求出来每个区间个数的最大分值,那就可以用线段树维护这个东西 然后出答案了 然后这个的求法和(luogu4269)Snow Boots G非常类似,就是我们把数大小排个序,每次都拿<=x ...

  6. Vladik and Entertaining Flags CodeForces - 811E (并查集,线段树)

    用线段树维护每一块左右两侧的并查集, 同色合并时若不连通则连通块数-1, 否则不变 #include <iostream> #include <algorithm> #incl ...

  7. bzoj2733 / P3224 [HNOI2012]永无乡(并查集+线段树合并)

    [HNOI2012]永无乡 每个联通块的点集用动态开点线段树维护 并查集维护图 合并时把线段树也合并就好了. #include<iostream> #include<cstdio&g ...

  8. 【离线 撤销并查集 线段树分治】bzoj1018: [SHOI2008]堵塞的交通traffic

    本题可化成更一般的问题:离线动态图询问连通性 当然可以利用它的特殊性质,采用在线线段树维护一些标记的方法 Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常 ...

  9. [SCOI2011]棘手的操作(可并堆/并查集/线段树)

    我懒死了 过于棘手 但这题真的很水的说 毕竟写啥都能过 常见思路: ①:由于不强制在线,所以重新编号之后线段树维护 ②:用各种可以高速合并的数据结构,比如可并堆,可并平衡树啥的 讲一种无脑算法: 对于 ...

随机推荐

  1. Apache Spark 2.2.0 中文文档 - 快速入门 | ApacheCN

    快速入门 使用 Spark Shell 进行交互式分析 基础 Dataset 上的更多操作 缓存 独立的应用 快速跳转 本教程提供了如何使用 Spark 的快速入门介绍.首先通过运行 Spark 交互 ...

  2. AES加解密算法Qt实现

    [声明] (1) 本文源码 在一位未署名网友源码基础上,利用Qt编程,实现了AES加解密算法,并添加了文件加解密功能.在此表示感谢!该源码仅供学习交流,请勿用于商业目的. (2) 图片及描述 除图1外 ...

  3. Angular学习笔记(一)

    本文为原创文章,转载请标明出处 目录 架构 模块 组件 模板 元数据 数据绑定 指令 服务 依赖注入 模板与数据绑定 1. 架构 模块 Angular 应用是模块化的,并且 Angular 有自己的模 ...

  4. 解决VMware下安装Ubuntu 16.04 不支持1920X1080分辨率的问题

    解决方法: flashmx@ubuntu:~$ cvt # 192.07M9) hsync: 67.16 kHz; pclk: 173.00 MHz Modeline -hsync +vsync fl ...

  5. hadoop(一)之初识大数据与Hadoop

    前言 从今天起,我将一步一步的分享大数据相关的知识,其实很多程序员感觉大数据很难学,其实并不是你想象的这样,只要自己想学,还有什么难得呢? 学习Hadoop有一个8020原则,80%都是在不断的配置配 ...

  6. IDE快捷键

    visual studio 中 : /// 快速函数注释 ctrl+k,ctrl+F 格式化代码 Android Studio  中: /**回车 快速函数注释 ctrl+h 查看继承关系 自动格式化 ...

  7. Python自学笔记-生成器(来自廖雪峰的官网Python3)

    感觉廖雪峰的官网http://www.liaoxuefeng.com/里面的教程不错,所以学习一下,把需要复习的摘抄一下. 以下内容主要为了自己复习用,详细内容请登录廖雪峰的官网查看. 生成器 通过列 ...

  8. 【转】 Python调用(运行)外部程序

    在Python中可以方便地使用os模块运行其他的脚本或者程序,这样就可以在脚本中直接使用其他脚本,或者程序提供的功能,而不必再次编写实现该功能的代码.为了更好地控制运行的进程,可以使用win32pro ...

  9. CodeSmith(C#)简单示例及相关小知识

    // 本文将介绍CodeSmith与数据库进行交互生成相应的存储过程,本例使用的数据库为SQL Server 2000. // 在与数据库进行交互时,我们使用到了一个CodeSmith自带的组件Sch ...

  10. 第七章 DAO模式

    第七章 DAO模式 一.JDBC的封装 1.JDBC的封装: DAO位于业务逻辑和持久化数据之间,实现对持久化数据的访问.将数据库都封装起来,对外提供相应的接口 2.DAO模式的作用: 1.隔离业务逻 ...