描述

校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的……
如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作:
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

2
普通的暴力算法,植树的时间为O(n),查询的时间也为O(n),所以总体的时间复杂度为O(nm)。
这里介绍一种独特的想法---括号法。
在植树区间的左端点放一个左括号“(”,右端点放一个右括号“)”,使得植树时间为O(1)。
显而易见,查询的结果为右端点左边“(”的个数减去左端点左边“)”的个数,时间为O(n)。
2至5之间有2-1=1种树。
3至5之间有2-0=2种树。
为了进一步优化时间复杂度,我们使用线段树维护左右括号的数量,使时间降到log级。
献上代码:
 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题解---线段树+括号法相关推荐

  1. UESTC-1546___Bracket Sequence —— 线段树 + 括号序列

    题目链接:点我啊╭(╯^╰)╮ 题目大意: 给出一个括号序列      setsetset -- 将给定区间全部转化为指定括号      reversereversereverse -- 将给定区间的 ...

  2. [bzoj2752]高速公路 题解(线段树)

    2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 2102  Solved: 887 [Submi ...

  3. [BZOJ 1095] [ZJOI2007]Hide 捉迷藏——线段树+括号序列(强..)

    神做法-%dalao,写的超详细 konjac的博客. 如果觉得上面链接的代码不够优秀好看,欢迎回来看本蒟蒻代码- CODE WITH ANNOTATION 代码中−6-6−6表示左括号'[',用−9 ...

  4. 【uoj#164】[清华集训2015]V 线段树维护历史最值

    题目描述 给你一个长度为 $n$ 的序列,支持五种操作: $1\ l\ r\ x$ :将 $[l,r]$ 内的数加上 $x$ : $2\ l\ r\ x$ :将 $[l,r]$ 内的数减去 $x$ , ...

  5. leetcode 218. The Skyline Problem | 218. 天际线问题(线段树)

    题目 https://leetcode-cn.com/problems/the-skyline-problem/ 题解 线段树问题,根据左神的思路改编,外加我想到的压缩的 tricks(数字范围太大, ...

  6. HDU 1754 I Hate It 线段树

    I Hate It Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要 ...

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

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

  8. 【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]里的每个数 ...

  9. 【luogu1816】忠(RMQ问题、线段树)

    题面 RMQ问题 题解 线段树 #include<iostream> #include<algorithm> using namespace std; const int ma ...

最新文章

  1. 贵州省新农合业务系统容灾技术支撑服务项目
  2. C++11 POD类型
  3. sublime java cmd_在sublime text3设置java环境
  4. 【算法】【殊途同归】搜索算法之(深度优先 || 广度优先) (约束条件 || 限界函数)
  5. 实实在在做一位教书匠(来自网络)
  6. C#LeetCode刷题之#283-移动零(Move Zeroes)
  7. mkhd中的matrix
  8. windows7 shift+右键 “在此处打开命令窗口”
  9. 浅淡个人学习嵌入式Linux过程
  10. 项目源码--Android聚合视频类播放器
  11. map转字符串数组中 php_php array_map()数组函数使用说明_PHP - ucfirst
  12. 16种英语时态总结归纳
  13. 谷歌邮箱无法显示使用 Base64 处理的图片的解决方法
  14. Mendeley-一款免费好用的文献管理软件
  15. Cocos2D:塔防游戏制作之旅(十)
  16. 浅析Js中${}字符串拼接
  17. 【单片机】keil和Proteus使用教程
  18. 面试文员计算机水平考题,文员面试的考题主要有那些?
  19. Oracle内存结构:SGA PGA UGA
  20. Windows 下常见的反调试方法

热门文章

  1. 【STM32】硬件随机数程序示例
  2. 【C++】 C++标准模板库(二) Lists
  3. java中 a_java中 a++ 和 ++a
  4. int a = 0 与 int a(0) int a(b)
  5. 每天一道LeetCode-----有效回文串
  6. 网站服务器windows登陆密码忘记,网站服务器windows登陆密码忘记
  7. CentOS密码忘记后的操作
  8. LC.exe”已退出,代码为 -1
  9. 智能指针weak_ptr
  10. 买卖股票的最佳时机IV