Vijos1448题解---线段树+括号法
描述
校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的……
如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作:
K=1,K=1,读入l、r表示在区间[l,r]中种上一种树,每次操作种的树的种类都不同
K=2,读入l,r表示询问l~r之间能见到多少种树(l,r>0)
输入格式
第一行n,m表示道路总长为n,共有m个操作
接下来m行为m个操作
输出格式
对于每个k=2输出一个答案
5 4
1 1 3
2 2 5
1 2 4
2 3 5
样例输出
1
1 #include <cstdio> 2 int n,m; 3 struct node 4 { 5 int x,y; 6 int a[3];//a[1]表示左括号的数量,a[2]表示右括号的数量。 7 }t[300002]; 8 void init(int k,int l,int r)//初始化。 9 { 10 t[k].x=l; 11 t[k].y=r; 12 if(l==r)return; 13 int mid=(l+r)/2; 14 init(2*k,l,mid); 15 init(2*k+1,mid+1,r); 16 } 17 void build(int k,int l,int op) 18 { 19 if(t[k].x<=l&&l<=t[k].y)//若在当前节点的范围内,括号数量加1。 20 t[k].a[op]++; 21 if(t[k].x==t[k].y)return; 22 int mid=(t[k].x+t[k].y)/2; 23 if(l<=mid)build(2*k,l,op);//查询左儿子。 24 if(l>=mid+1)build(2*k+1,l,op);//查询右儿子。 25 } 26 int find(int k,int l,int r,int op)//查找l到r内括号的个数。 27 { 28 int ans=0; 29 if(l<=t[k].x&&t[k].y<=r)return t[k].a[op]; 30 int mid=(t[k].x+t[k].y)/2; 31 if(l<=mid)ans+=find(2*k,l,r,op); 32 if(r>=mid+1)ans+=find(2*k+1,l,r,op); 33 return ans; 34 } 35 int main() 36 { 37 int k,l,r,ans1,ans2; 38 scanf("%d%d",&n,&m); 39 init(1,1,n); 40 for(int i=1;i<=m;i++) 41 { 42 scanf("%d%d%d",&k,&l,&r); 43 if(k==1) 44 { 45 build(1,l,1); 46 build(1,r,2); 47 } 48 if(k==2) 49 { 50 ans1=ans2=0; 51 ans1=find(1,1,r,1); 52 if(l-1>=1)ans2=find(1,1,l-1,2); 53 printf("%d\n",ans1-ans2); 54 } 55 } 56 return 0; 57 }
转载于:https://www.cnblogs.com/c0per/p/5775043.html
Vijos1448题解---线段树+括号法相关推荐
- UESTC-1546___Bracket Sequence —— 线段树 + 括号序列
题目链接:点我啊╭(╯^╰)╮ 题目大意: 给出一个括号序列 setsetset -- 将给定区间全部转化为指定括号 reversereversereverse -- 将给定区间的 ...
- [bzoj2752]高速公路 题解(线段树)
2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec Memory Limit: 128 MB Submit: 2102 Solved: 887 [Submi ...
- [BZOJ 1095] [ZJOI2007]Hide 捉迷藏——线段树+括号序列(强..)
神做法-%dalao,写的超详细 konjac的博客. 如果觉得上面链接的代码不够优秀好看,欢迎回来看本蒟蒻代码- CODE WITH ANNOTATION 代码中−6-6−6表示左括号'[',用−9 ...
- 【uoj#164】[清华集训2015]V 线段树维护历史最值
题目描述 给你一个长度为 $n$ 的序列,支持五种操作: $1\ l\ r\ x$ :将 $[l,r]$ 内的数加上 $x$ : $2\ l\ r\ x$ :将 $[l,r]$ 内的数减去 $x$ , ...
- leetcode 218. The Skyline Problem | 218. 天际线问题(线段树)
题目 https://leetcode-cn.com/problems/the-skyline-problem/ 题解 线段树问题,根据左神的思路改编,外加我想到的压缩的 tricks(数字范围太大, ...
- HDU 1754 I Hate It 线段树
I Hate It Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要 ...
- 【loj6029】「雅礼集训 2017 Day1」市场 线段树+均摊分析
题目描述 给出一个长度为 $n$ 的序列,支持 $m$ 次操作,操作有四种:区间加.区间下取整除.区间求最小值.区间求和. $n\le 100000$ ,每次加的数在 $[-10^4,10^4]$ 之 ...
- 【bzoj4355】Play with sequence 线段树区间最值操作
题目描述 维护一个长度为N的序列a,现在有三种操作: 1)给出参数U,V,C,将a[U],a[U+1],...,a[V-1],a[V]都赋值为C. 2)给出参数U,V,C,对于区间[U,V]里的每个数 ...
- 【luogu1816】忠(RMQ问题、线段树)
题面 RMQ问题 题解 线段树 #include<iostream> #include<algorithm> using namespace std; const int ma ...
最新文章
- 贵州省新农合业务系统容灾技术支撑服务项目
- C++11 POD类型
- sublime java cmd_在sublime text3设置java环境
- 【算法】【殊途同归】搜索算法之(深度优先 || 广度优先) (约束条件 || 限界函数)
- 实实在在做一位教书匠(来自网络)
- C#LeetCode刷题之#283-移动零(Move Zeroes)
- mkhd中的matrix
- windows7 shift+右键 “在此处打开命令窗口”
- 浅淡个人学习嵌入式Linux过程
- 项目源码--Android聚合视频类播放器
- map转字符串数组中 php_php array_map()数组函数使用说明_PHP - ucfirst
- 16种英语时态总结归纳
- 谷歌邮箱无法显示使用 Base64 处理的图片的解决方法
- Mendeley-一款免费好用的文献管理软件
- Cocos2D:塔防游戏制作之旅(十)
- 浅析Js中${}字符串拼接
- 【单片机】keil和Proteus使用教程
- 面试文员计算机水平考题,文员面试的考题主要有那些?
- Oracle内存结构:SGA PGA UGA
- Windows 下常见的反调试方法
热门文章
- 【STM32】硬件随机数程序示例
- 【C++】 C++标准模板库(二) Lists
- java中 a_java中 a++ 和 ++a
- int a = 0 与 int a(0) int a(b)
- 每天一道LeetCode-----有效回文串
- 网站服务器windows登陆密码忘记,网站服务器windows登陆密码忘记
- CentOS密码忘记后的操作
- LC.exe”已退出,代码为 -1
- 智能指针weak_ptr
- 买卖股票的最佳时机IV