题目

对于两个区间\((a,b),(c,d)\),若\(c < a < d\)或\(c < b < d\)则可以从\((a,b)\)走到\((c,d)\)去,现在有以下两种操作:

  • 给定\(1 \space x \space y\),表示在集合中添加\((x,y)\)这个区间,保证新加入的这个区间一定比之前的所有区间长度长。
  • 给定\(2 \space a \space b\),表示询问是否有一条路径能从第\(a\)个区间走到第\(b\)个区间。

初始时区间集合为空,现在请你回答所有的询问
\(1 \leq n \leq 10^5,所有数字绝对值 \leq 10^9\)

题解:

容易发现新加入的区间与其左右端点落到的区间一定是可以互达的。
所以可以合并其集合。
那么对于新加入的区间所覆盖的区间来说,多了一条到新加入区间的单向边。
我们可以统计记录所有集合的最小左端点和最大右端点来判断一个区间是否可以通过有向边到达另一个区间。

对于区间的维护我们可以使用并查集。
同时使用线段树来维护插入区间和查询覆盖单点的所有区间的操作。

由于每次进行完合并操作后点上的所有的区间都会合并为一个。
所以总体复杂度\(O(n\log^2n)\)

#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(int &x){x=0;static char ch;static bool flag;flag = false;while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
#define rg register int
#define rep(i,a,b) for(rg i=(a);i<=(b);++i)
#define per(i,a,b) for(rg i=(a);i>=(b);--i)
const int maxn = 100010;
int L[maxn],R[maxn],op[maxn];
int c[maxn<<1],cnt = 0,fa[maxn];
int find(int x){return fa[x] == x ? x : fa[x] = find(fa[x]);}
inline void Union(int u,int v){int x = find(u),y = find(v);if(x == y) return ;fa[x] = y;L[y] = min(L[y],L[x]);R[y] = max(R[y],R[x]);return ;
}
vector<int>ve[maxn<<3];
void modify(int rt,int l,int r,int p,int id){for(vector<int>::iterator it = ve[rt].begin();it != ve[rt].end();++it) Union(*it,id);if(ve[rt].empty() == false) ve[rt].clear(),ve[rt].push_back(find(id));if(l == r) return ;int mid = l+r >> 1;if(p <= mid) modify(rt<<1,l,mid,p,id);else modify(rt<<1|1,mid+1,r,p,id);
}
void insert(int rt,int l,int r,int L,int R,int id){if(L <= l && r <= R){ve[rt].push_back(id);return ;}int mid = l+r >> 1;if(L <= mid) insert(rt<<1,l,mid,L,R,id);if(R >  mid) insert(rt<<1|1,mid+1,r,L,R,id);
}
int idx[maxn],num = 0;
int main(){freopen("interval.in","r",stdin);freopen("interval.out","w",stdout);int n;read(n);rep(i,1,n){read(op[i]);read(L[i]);read(R[i]);if(op[i] == 1) c[++cnt] = L[i],c[++cnt] = R[i];}sort(c+1,c+cnt+1);rep(i,1,n){if(op[i] == 1){int l = lower_bound(c+1,c+cnt+1,L[i]) - c;int r = lower_bound(c+1,c+cnt+1,R[i]) - c;idx[++ num] = i;fa[i] = i;modify(1,1,cnt,l,i);modify(1,1,cnt,r,i);if(l+1 <= r-1) insert(1,1,cnt,l+1,r-1,i);}else{int u = find(idx[L[i]]);int v = find(idx[R[i]]);//printf("u = %d,v = %d\n",u,v);if(u == v) puts("YES");else if(L[v] < L[u] && L[u] < R[v]) puts("YES");else if(L[v] < R[u] && R[u] < R[v]) puts("YES");else puts("NO");}}return 0;
}

转载于:https://www.cnblogs.com/Skyminer/p/7101229.html

「长乐集训 2017 Day1」区间 线段树相关推荐

  1. ZCUM-1948: #6029. 「雅礼集训 2017 Day1」市场 线段树区间更新

    题目连接:点击打开链接 从前有一个贸易市场,在一位执政官到来之前都是非常繁荣的,自从他来了之后,发布了一系列奇怪的政令,导致贸易市场的衰落. 有 n nn 个商贩,从 0∼n−1 0 \sim n - ...

  2. 【loj6029】「雅礼集训 2017 Day1」市场 线段树+均摊分析

    题目描述 给出一个长度为 $n$ 的序列,支持 $m$ 次操作,操作有四种:区间加.区间下取整除.区间求最小值.区间求和. $n\le 100000$ ,每次加的数在 $[-10^4,10^4]$ 之 ...

  3. 数据结构二之线段树Ⅱ——KiKi‘s K-Number,ball,The Child and Sequence,「雅礼集训 2017 Day1」市场,Atlantis

    值域线段树+势能线段树+扫描线 KiKi's K-Number ball The Child and Sequence 「雅礼集训 2017 Day1」市场 Atlantis KiKi's K-Num ...

  4. #6029. 「雅礼集训 2017 Day1」市场(势能,区间除)

    #6029. 「雅礼集训 2017 Day1」市场 用线段树维护数列,区间上维护最大最小值,区间和还有标记,修改时,区间加直接做,而区间除时,递归到线段树上某一区间,如果这一操作等价于区间加(也就是最 ...

  5. LibreOJ#6030. 「雅礼集训 2017 Day1」矩阵

    https://loj.ac/problem/6030 如果矩阵第i列有一个黑色, 那可以用他把第i行全都染黑,也可以使任意一列具有黑色 然后就可以用第i行把矩阵染黑 染黑一列的代价最少是1 染黑一行 ...

  6. LOJ #573. 「LibreOJ NOI Round #2」单枪匹马 线段树

    $f$ 函数暴力计算的话是 $O(n)$ 的(用一个 $\frac{x}{y}$ 来保存每一步计算结果,然后依次合并) 我们将一段区间的结果写成 $\frac{ax+by}{cx+dy}$ 的形式,初 ...

  7. #6034. 「雅礼集训 2017 Day2」线段游戏 李超树

    #6034. 「雅礼集训 2017 Day2」线段游戏 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统 ...

  8. [LOJ#2329]「清华集训 2017」我的生命已如风中残烛

    [LOJ#2329]「清华集训 2017」我的生命已如风中残烛 试题描述 九条可怜是一个贪玩的女孩子. 这天她在一堵墙钉了 \(n\) 个钉子,第 \(i\) 个钉子的坐标是 \((x_i,y_i)\ ...

  9. [LOJ 6042]「雅礼集训 2017 Day7」跳蚤王国的宰相(树的重心+贪心)

    [LOJ 6042]「雅礼集训 2017 Day7」跳蚤王国的宰相 description solution 一个到所有节点距离和最小的节点 ⇔\Leftrightarrow⇔ 树的重心(满足最重的儿 ...

  10. Loj #2324. 「清华集训 2017」小 Y 和二叉树

    Loj #2324. 「清华集训 2017」小 Y 和二叉树 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙上, ...

最新文章

  1. LAMP--Apache 禁止指定 user_agent
  2. 微信抢红包的方案_免费公开实收20000的烤鸭店营销方案,餐饮行业可复用
  3. bootstrap 一排5个_Bootstrap5 列(Columns)
  4. java调用dubbo服务器_dubbo源码分析-服务端注册流程-笔记
  5. 科技强,必须应用数学强
  6. php下拉列表 二级 联动,PHP+Ajax实现二级联动下拉菜单!
  7. Team Foundation Server 2010 安装、部署与配置(一):安装计划 .
  8. html怎么判断字段,javascript怎么判断是否为字符串?
  9. knn算法python代码_在python中使用KNN算法处理缺失的数据
  10. c语言学习之结构篇代码演示样例-输入n个同学的姓名,数学英语成绩,依照平均分从低到高排序并输出...
  11. 008 查看套接字选项是否受支持(获取当前环境下套接字选项默认值)
  12. winFrom窗体样式
  13. tensorflow入门(一)波士顿房价数据集
  14. Kali Linux 2017.3 安装网易云音乐
  15. IO编程(对IO是什么的详解)
  16. 改变世界的十大计算机病毒(图)
  17. 流利阅读 2019.1.30 China’s Baidu pledges to improve search service after complaint
  18. 蓝桥杯单片机学习3——数码管静态显示
  19. python最大公约数算法流程图,Python 最大公约数算法
  20. 生活无大事,生活无小事,需用心经营才行

热门文章

  1. postman 测试excel下载_使用Postman轻松实现接口数据关联
  2. 【Django 2021年最新版教程21】数据库查询 model 多条数据 queryset转dict字典 返回渲染到前端
  3. Docker教程小白实操入门(16)--如何使用ONBUILD指令在构建下一级镜像时做些什么
  4. unable to remove repository reference  (must force) - container is using its referenced image
  5. 基于springboot的失物招领系统
  6. 苹果电脑 默认安装jdk位置_CH01_JDK安装和配置(含macOS)
  7. 开发中一些常用的代码片段(持续更新,要是各位大牛看见了麻烦也给在评论区添一下常用的代码)
  8. vue之生命周期(beforeCreate,created,beforeMount,mounted,beforeUpdate,updated)
  9. Java 垃圾收集策略、垃圾分代回收算法、垃圾回收运作流程
  10. Spring Boot Actuator 监控和管理应用程序