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]棘手的操作(可并堆/并查集/线段树)
我懒死了 过于棘手 但这题真的很水的说 毕竟写啥都能过 常见思路: ①:由于不强制在线,所以重新编号之后线段树维护 ②:用各种可以高速合并的数据结构,比如可并堆,可并平衡树啥的 讲一种无脑算法: 对于 ...
随机推荐
- Spring-java-模板设计模式
1,模板设计模式指的是将相应的模板方法提取出来在专门的位置定义,然后把相同调用过程操作,通过模板来实现对于模板设计模式而言,一般有两种实现方式 1)基于继承的实现 2)基于组合的实现 Spring的J ...
- hadoop超租约报错:
解决方法:修改linux打开文件最大限制Java代码 echo "fs.file-max = 65535" >> /etc/sysctl.conf echo " ...
- 简易RPC框架-私有协议栈
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- 前端系列——jquery前端国际化解决方案“填坑日记”
前言:最近,新的平台还没有开发完成,原来的老项目又提出了新的需求:系统国际化.如果是前后端完全分离的开发模式,要做国际化,真的太简单了,有现成的解决方案,基于Node构建的时下热门的任何一种技术选型都 ...
- 深入浅出AQS之独占锁模式
每一个Java工程师应该都或多或少了解过AQS,我自己也是前前后后,反反复复研究了很久,看了忘,忘了再看,每次都有不一样的体会.这次趁着写博客,打算重新拿出来系统的研究下它的源码,总结成文章,便于以后 ...
- JSP入门 文件上传
commons-fileupload public void save(HttpServletRequest request,HttpServletResponse response) throws ...
- 基于Quartz实现简单的定时发送邮件
一.什么是Quartz Quartz 是一个轻量级任务调度框架,只需要做些简单的配置就可以使用:它可以支持持久化的任务存储,即使是任务中断或服务重启后,仍可以继续运行.Quartz既可以做为独立的应用 ...
- 如何使用windows版Docker并在IntelliJ IDEA使用Docker运行Spring Cloud项目
如何使用windows版Docker并在IntelliJ IDEA使用Docker运行Spring Cloud项目 #1:前提准备 1.1 首先请确认你的电脑是windows10专业版或企业版,只有这 ...
- Drying poj3104(二分)
Drying Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 7916 Accepted: 2006 Descriptio ...
- 【NOIP2016提高组day2】蚯蚓
那么我们开三个不上升队列, 第一个记录原来的蚯蚓, 第二个记录乘以p的蚯蚓 第三个记录乘以(1-p)的蚯蚓, 在记录每条就要入队列的时间,就可以求出增加的长度 每次比较三个队列的队首,取最大的值x的切 ...