YYHS-猜数字(并查集/线段树维护)
题目描述
输入
接下来T行,每行三个数分别表示li,ri和xi。
输出
样例输入
1 10 7
5 19 7
3 12 8
1 20 1
样例输出
提示
题解
这道题我们先考虑矛盾的情况
我们不难发现有以下两种情况是矛盾的
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-猜数字(并查集/线段树维护)的更多相关文章
- UVA1455 - Kingdom(并查集 + 线段树)
UVA1455 - Kingdom(并查集 + 线段树) 题目链接 题目大意:一个平面内,给你n个整数点,两种类型的操作:road x y 把city x 和city y连接起来,line fnum ...
- 并查集&线段树&树状数组&排序二叉树
超级无敌巨牛逼并查集(带权并查集)https://vjudge.net/problem/UVALive-4487 带删点的加权并查集 https://vjudge.net/problem/UVA-11 ...
- 【Codeforces576E_CF576E】Painting Edges(可撤销并查集+线段树分治)
题目 CF576E 分析: 从前天早上肝到明天早上qwq其实颓了一上午MC ,自己瞎yy然后1A,写篇博客庆祝一下. 首先做这题之前推荐一道很相似的题:[BZOJ4025]二分图(可撤销并查集+线段树 ...
- BZOJ 3910 并查集+线段树合并
思路: 1. 并查集+线段树合并 记得f[LCA]==LCA的时候 f[LCA]=fa[LCA] 2.LCT(并不会写啊...) //By SiriusRen #include <cstdio& ...
- luogu5012 水の数列 (并查集+线段树)
如果我们能求出来每个区间个数的最大分值,那就可以用线段树维护这个东西 然后出答案了 然后这个的求法和(luogu4269)Snow Boots G非常类似,就是我们把数大小排个序,每次都拿<=x ...
- Vladik and Entertaining Flags CodeForces - 811E (并查集,线段树)
用线段树维护每一块左右两侧的并查集, 同色合并时若不连通则连通块数-1, 否则不变 #include <iostream> #include <algorithm> #incl ...
- bzoj2733 / P3224 [HNOI2012]永无乡(并查集+线段树合并)
[HNOI2012]永无乡 每个联通块的点集用动态开点线段树维护 并查集维护图 合并时把线段树也合并就好了. #include<iostream> #include<cstdio&g ...
- 【离线 撤销并查集 线段树分治】bzoj1018: [SHOI2008]堵塞的交通traffic
本题可化成更一般的问题:离线动态图询问连通性 当然可以利用它的特殊性质,采用在线线段树维护一些标记的方法 Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常 ...
- [SCOI2011]棘手的操作(可并堆/并查集/线段树)
我懒死了 过于棘手 但这题真的很水的说 毕竟写啥都能过 常见思路: ①:由于不强制在线,所以重新编号之后线段树维护 ②:用各种可以高速合并的数据结构,比如可并堆,可并平衡树啥的 讲一种无脑算法: 对于 ...
随机推荐
- Mysql中的like模糊查询
MySql的like语句中的通配符:百分号.下划线和escape %代表任意多个字符 _代表一个字符 escape,转义字符后面的%或_,使其不作为通配符,而是普通字符匹配 数据库数据如下: 1. ...
- webservice06#异常#Handler
1, 异常处理 package com.yangw.soap.service; public class UserException extends Exception { public UserEx ...
- Kafka水位(high watermark)与leader epoch的讨论
~~~这是一篇有点长的文章,希望不会令你昏昏欲睡~~~ 本文主要讨论0.11版本之前Kafka的副本备份机制的设计问题以及0.11是如何解决的.简单来说,0.11之前副本备份机制主要依赖水位(或水印) ...
- JavaScript中的與和或的規則
與(&&)的規則是: 第一項的Boolean值為false,則返回第一項的值 第一項的Boolean值為true,則返回第二項的值 簡記:一假返一,一真返二 與:一假為假,全真為真 或 ...
- MySQL的一点浅显知识
本人最近看了一本有关于MySQL的书籍<MySQL必知必会>,书中只写了一些基本知识,但是也基本涵盖了所有的MySQL的知识点.其余的比较高级的也只是在基础上进行扩展或者是优化,看完这本书 ...
- oracle 权限
一.介绍这一部分我们主要看看oracle中如何管理权限和角色,权限和角色的区别在哪里.当刚刚建立用户时,用户没有任何权限,也不能执行任何操作.如果要执行某种特定的数据库操作,则必须为其授予系统的权限: ...
- 代码与编程(java基础)
代码与编程(面试与笔试java) 1.写一个Singleton出来 Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 一般Singleton模式通常有几种种 ...
- java基础——java.util.ConcurrentModificationException
在编写代码的时候,有时候会遇到List里有符合条件的的对象,就移除改对象! 但是这种操作如:使用了 List 的remove,会导致一些很严重的问题! 如下这段代码使用ArrayList: @Test ...
- Linux入门之常用命令(12) mount
查看Linux所有设备 cd /dev ls -l sd* //分区 查看Linux磁盘 fdisk -lu 挂载 一般挂载至/mnt /media mount /dev/sda5 /mnt/ ...
- Hive 存储类型 StoreType
file_format: : SEQUENCEFILE | TEXTFILE -- (Default, depending on hive.default.fileformat configurati ...