蓝桥杯 校门外面的树 (线段树,区间处理)
由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已 知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树 都移走后,马路上还有多少棵树。
150 300
100 200
470 471
对于其它的数据,区域之间有重合的情况。
1 #include<iostream> 2 using namespace std; 3 struct node{ 4 int l,r,w; 5 }tree[50050]; 6 void create(int i,int left,int right){ 7 tree[i].l=left;tree[i].r=right; 8 if(left==right){ 9 tree[i].w=1; 10 return; 11 } 12 int mid=(left+right)>>1; 13 create(i<<1,left,mid); 14 create((i<<1)|1,mid+1,right); 15 tree[i].w=tree[i<<1].w+tree[(i<<1)|1].w; 16 } 17 void update(int i,int left,int right){ 18 if(tree[i].l==tree[i].r){ 19 tree[i].w=0;return; 20 } 21 if(tree[i].l==left&&tree[i].r==right){ 22 tree[i].w=0;return; 23 } 24 if(tree[i].w==0) return; 25 int mid=(tree[i].l+tree[i].r)>>1; 26 if(right<=mid){ 27 update(i<<1,left,right); 28 }else if(left>mid){ 29 update((i<<1)|1,left,right); 30 }else{ 31 update(i<<1,left,mid); 32 update((i<<1)|1,mid+1,right); 33 } 34 tree[i].w=tree[i<<1].w+tree[(i<<1)|1].w; 35 } 36 int find(int i,int left,int right){ 37 if(tree[i].w==0)return 0; 38 if(left==right) return 1; 39 if(tree[i].l==left&&tree[i].r==right){ 40 return tree[i].w; 41 } 42 int mid=(tree[i].l+tree[i].r)>>1; 43 if(right<=mid){ 44 return find(i<<1,left,right); 45 }else if(left>mid){ 46 return find((i<<1)|1,left,right); 47 }else{ 48 return find(i<<1,left,mid)+find((i<<1)|1,mid+1,right); 49 } 50 } 51 int main(){ 52 int L,M,le,ri; 53 cin>>L>>M; 54 create(1,0,L); 55 while(M--){ 56 cin>>le>>ri; 57 update(1,le,ri); 58 } 59 cout<<find(1,0,L)<<endl; 60 return 0; 61 }
转载于:https://www.cnblogs.com/yifan2016/p/5273050.html
蓝桥杯 校门外面的树 (线段树,区间处理)相关推荐
- ( 题解 )第六届蓝桥杯决赛试题 -- 完美正方形 (线段树 + 深搜)
题目 : 完美正方形 如果一些边长互不相同的正方形,可以恰好拼出一个更大的正方形,则称其为完美正方形. 历史上,人们花了很久才找到了若干完美正方形.比如:如下边长的22个正方形 2 3 4 6 7 8 ...
- 树套树-线段树套平衡树
作用 线段树的作用是区间修改和查询,平衡树的作用是查询第k大,k的排名,前驱,后继.这两个结合起来,就变成了可以区间修改和查询第k大,k的排名,前驱,后继的数据结构:树套树-线段树套平衡树. 实现 先 ...
- bzoj 1984: 月下“毛景树” 线段树+树链剖分
题意 给出一棵n个节点的树,每条边都有权值,要求资瓷以下操作: Max x y表示查询x到y之间的最大权值 Cover x y z表示把x到y的权值赋为z Change x y表示把第x条边的权值变成 ...
- 线段树 ---- 线段树上区间二分 或者单点二分 codeforces C. Greedy Shopping
题目大意 题目大意: 给你一个非增的区间现在你有两次操作 1 x y : 把[a1,...ax][a_1,...a_x][a1,...ax]里面的数对yyy取maxmaxmax 2 x y : 你 ...
- 线段树 ---- 线段树维护线段相加+滑动变长窗口 2021牛客多校第7场 F xay loves trees
题目大意: 给你两个大小相同的树但是形状不一定一样 叫你选出最大的子集,满足下面两个条件 在第一颗树上是一条链 在第二颗树上任意两个点都不是祖先关系 解题思路: 首先我们现在第二颗树上面把每个点的df ...
- BZOJ 3685: 普通van Emde Boas树( 线段树 )
建颗权值线段树就行了...连离散化都不用... 没加读入优化就TLE, 加了就A掉了...而且还快了接近1/4.... ---------------------------------------- ...
- 2021CCPC(桂林) - Suffix Automaton(后缀树+线段树)
题目链接:点击查看 题目大意:给出一个长度为 nnn 的字符串,再给出 qqq 次询问,每次询问需要输出本质不同第 kkk 小的子串的起止位置.如果有多个答案,输出起点最小的那个. 本题规定字符串大小 ...
- 牛客 - sequence(笛卡尔树+线段树)
题目链接:点击查看 题目大意:给出一个长度为 n 的数列 a 和数列 b ,求 题目分析:不算难的题目,对于每个 a[ i ] 求一下贡献然后维护最大值就好,具体思路就是,先找出每个 a[ i ] 左 ...
- HDU - 4417 Super Mario(主席树/线段树+离线)
题目链接:点击查看 题目大意:给出由 n 个数的数列,再给出 m 次查询,每次查询需要输出 [ l , r ] 内小于等于 h 的数有多少个 题目分析:大晚上睡不着觉随便做做题,发现这个题目原来可以用 ...
最新文章
- 0pp0r11如何更改语言_更改电脑日期的方法
- 什么是 CAS 机制?
- 归并排序改良 java_Java 八种排序算法总结
- 【CentOS】如何在线安装pcre?
- 四 s5p4418 Android 对can总线的支持 支持波特率修改
- python echo off_生活中的python-随机分配单词输出至word
- c检程序的公共语言运行时简称为,公共语言运行时检测到无效的程序
- 科沃斯扫地机器人阿尔法_科沃斯(Ecovacs)阿尔法地宝简单开箱
- 编程算法基础-一刀切法
- Qt Style Sheets Reference Qt css 样式属性列表[官版]
- 【爬虫】花瓣采集下载器
- 解决其他浏览器能上网谷歌浏览器不能上网
- 有哪些常用的搜索引擎指令?
- android 高仿拼多多,Android 仿京东、拼多多商品分类页
- java基础猜拳游戏
- MATLAB3 二维和三维图像的绘制
- 基于SSM企业留言系统
- 精益生产25个必备工具!
- 高通平台msm8916修改开机logo【原创】
- 让线程按顺序执行 8 种方法
热门文章
- 炫酷,SpringBoot+Echarts实现用户访问地图可视化(附源码)
- 网络常见的 9 大命令,非常实用!
- 人工神经网络背后的数学原理!
- MySQL环境配置和入门讲解!
- 教程 | 算法太多挑花眼?教你如何选择正确的机器学习算法
- 两位院士同时受聘,山东大学再添强援
- CVPR Oral:我给大家表演一个无中生有|北航商汤耶鲁
- 中国最大AI预训练模型发布:113亿参数!北京智源研究院、阿里、清华等联手打造...
- 机器人替代研究员,工作007,完成688次实验,登上Nature封面
- 清华理工男,跳了7年舞,来华为一年当了PL,这什么小哥哥