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]棘手的操作(可并堆/并查集/线段树)
我懒死了 过于棘手 但这题真的很水的说 毕竟写啥都能过 常见思路: ①:由于不强制在线,所以重新编号之后线段树维护 ②:用各种可以高速合并的数据结构,比如可并堆,可并平衡树啥的 讲一种无脑算法: 对于 ...
随机推荐
- JUDE-UML工具软件介绍
JUDE社区版(不考虑破-解). 现在Jude改名为Astah了.JUDE已停止发展,Astah是它的替代品.Jude有3个版: Professional版, Community版(免费),Share ...
- Java中迭代器Iterator的使用
Java集合类中Map接口下的相关类并没有像Collection接口的相关类一样实现get()方法,因此在要实现遍历输出的场景中没法直接用get()方法来取得对象中的数据,但Java本身提供了另一种遍 ...
- 读Zepto源码之Gesture模块
Gesture 模块基于 IOS 上的 Gesture 事件的封装,利用 scale 属性,封装出 pinch 系列事件. 读 Zepto 源码系列文章已经放到了github上,欢迎star: rea ...
- WILL吃桃_KEY
WILL 吃桃 (peach.pas/c/cpp) [ 题目描述] Will 很喜欢吃桃, 某天 Will 来到了一片森林, 森林中有 N 颗桃树, 依次编号为 1,2,„,N.每棵树上有数量不等的桃 ...
- String.getBytes(),源码之下,了无秘密
@Deprecated public void getBytes(int srcBegin, int srcEnd, byte dst[], int dstBegin) { if (srcBegin ...
- iOS Storyboard约束详解
链接:http://www.jianshu.com/p/b88c65ffc3eb 约束,就是指--此处略去1万字--都懂的,就不说了.直接进入实战环节. 本文的控件约束都是围绕着UITableView ...
- vue学习之父组件与子组件之间的交互
1.父组件数据传给子组件 父组件中的msgfather定义数据 在之组件中通过设置props来取得希望从父组件中获得的值 通过设置这两个属性就可以从父组件传数据到子组件 2.子组件传数据给父组件(这里 ...
- zoj3954 详细讲解 排序比较单词法
Seven-Segment Display Time Limit: 1 Second Memory Limit:65536 KB A seven segment display, or se ...
- 数据处理:12个使得效率倍增的pandas技巧
数据处理:12个使得效率倍增的pandas技巧 1. 背景描述 Python正迅速成为数据科学家偏爱的语言,这合情合理.它拥有作为一种编程语言广阔的生态环境以及众多优秀的科学计算库.如果你刚开始学习P ...
- redis requires Ruby version >= 2.2.2问题
最近在研究redis的集群,redis官方提供了redis-trib.rb工具,但是在使用之前 需要安装ruby,以及redis和ruby连接: yum -y install ruby ruby-de ...