Vijos1448校门外的树 题解
Vijos1448校门外的树 题解

以上就是括号序列的过程。简单的说,就是更新区间[a,b]时,点a记录左括号数,点b记录右括号数,查询区间[a,b]时,即为b之前(包括b)的左括号数-a之前的右括号数。
#include "bits/stdc++.h"
#define maxN 50010 using namespace std ;
typedef long long QAQ ; struct Tree
{
int l , r ;
QAQ liml , limr ;//左括号右括号
}; Tree tr[maxN << ]; void Build_Tree ( int x , int y , int i )//建树
{
tr[i].l = x ;
tr[i].r = y ;
if( x == y )return ;
else
{
QAQ mid = (tr[i].l + tr[i].r) >> ;
Build_Tree ( x , mid , i << );
Build_Tree ( mid + , y , i << | );
return ;
}
} void Update_left ( int w , int i )
{
if( w == tr[i].l && w == tr[i].r )tr[i].liml++;//找到目标节点
else
{
QAQ mid = (tr[i].l + tr[i].r) >> ;
if( w > mid )Update_left( w , i << | );//找右儿子
else if( w <= mid)Update_left( w , i << );//找左儿子
tr[i].liml = tr[i << ].liml + tr[i << | ].liml ;//回溯更新
}
} void Update_right ( int w , int i )//同Update_left
{
if( w == tr[i].l && w == tr[i].r )tr[i].limr++;
else
{
QAQ mid = (tr[i].l + tr[i].r) >> ;
if( w > mid )Update_right( w , i << | );
else if( w <= mid)Update_right( w , i << );
tr[i].limr = tr[i << ].limr + tr[i << | ].limr ;
}
} QAQ Query_left ( int q , int w , int i )//同Query_right
{
if( q <= tr[i].l && w >= tr[i].r )return tr[i].liml ;
else
{
QAQ mid = (tr[i].l + tr[i].r) >> ;
if ( q > mid )return Query_left ( q , w , i << | );
else if ( w <= mid ) return Query_left ( q , w , i << );
else return Query_left ( q , w , i << | ) + Query_left ( q , w , i << );
}
} QAQ Query_right ( int q , int w , int i )
{
if( q <= tr[i].l && w >= tr[i].r )return tr[i].limr ;//找到目标区间直接返回
else
{
QAQ mid = (tr[i].l + tr[i].r) >> ;
if ( q > mid )return Query_right ( q , w , i << | );//找右儿子
else if ( w <= mid ) return Query_right ( q , w , i << );//找左儿子
else return Query_right ( q , w , i << | ) + Query_right ( q , w , i << );//左右儿子都查找
}
} int main()
{
int N, M, op, ll, rr ;
scanf("%d %d", &N, &M);
Build_Tree ( , N , ) ;//建树
while(M--)
{
scanf("%d%d%d", &op, &ll, &rr);
if( op == )
{
Update_left ( ll , );//添加左括号
Update_right ( rr , );//添加右括号
}
else
{
QAQ ans = Query_left( , rr , );
if (ll != )ans -= Query_right( , ll - , );//当ll不等于1时再相减,否则栈会炸
printf("%I64d\n", ans);
}
}
return ;
}
Vijos1448校门外的树 题解的更多相关文章
- Vijos1448 校门外的树 [树状数组]
题目传送门 校门外的树 描述 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的……如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作:K= ...
- vijos1448校门外的树
描述 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的……如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作:K=1,K=1,读入l.r表 ...
- 洛谷P1047校门外的树题解
题目 此题是一个模拟题,但需要注意的一点就是它的树是从数轴的0开始,所以我们也要从0开始,这样才能实现代码. 代码: #include<iostream> using namespace ...
- 洛谷 P1047 校门外的树 题解
Case 1. 本题其实不难,直接模拟就可以了.时间复杂度: \(O(L \times M)\) Case 2. 考虑一个简单的增强:把原来的: \[L \leq 10^4,M \leq 10^2 \ ...
- >题解< 校门外的树
题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是 11 米.我们可以把马路看成一个数轴,马路的一端在数轴 00 的位置,另一端在 LL 的位置:数轴上的每个整数点,即 0,1 ...
- JDOJ 2197: 校门外的树
JDOJ 2197: 校门外的树 题目传送门 Description 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米. 我们可以把马路看成一个数轴,马路的一端在数轴1的位置,另一 ...
- NC16649 [NOIP2005]校门外的树
NC16649 [NOIP2005]校门外的树 题目 题目描述 某校大门外长度为 \(L\) 的马路上有一排树,每两棵相邻的树之间的间隔都是 \(1\) 米.我们可以把马路看成一个数轴,马路的一端在数 ...
- P1047 校门外的树
P1047 校门外的树 题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0 ...
- OpenJudge计算概论-校门外的树
/*======================================================================== 校门外的树 总时间限制: 1000ms 内存限制: ...
随机推荐
- SQL 参数,传入参数和自己申明参数——异常抛出
ALTER PROCEDURE [dbo].[OA_RemoveProject] @Password nvarchar(30), --这是传入的参数 @ProjectNo nvarchar(8) AS ...
- Linux内核驱动之GPIO子系统(一)GPIO的使用
转自:http://blog.csdn.net/mirkerson/article/details/8464290 一 概述 Linux内核中gpio是最简单,最常用的资源(和 interrupt , ...
- Spell checker
Spell checker Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Subm ...
- python类中的super,原理如何?MRO是什么东东?
下面这个URL解释得比较清楚. http://python.jobbole.com/86787/?utm_source=group.jobbole.com&utm_medium=related ...
- 使用windows的远程桌面连接连接Ubuntu
想起来用笔记本连接一个windows server时只需要在远程桌面连接里面输入一下ip地址然后账号密码就可以了,十分简单.于是乎既然装了个Ubuntu当服务器使那么我就业来远程连接一下,由于wind ...
- WebView相关
Android WebView使用基础 Android WebView中的JavaScript代码使用 很不错的例子:android webview js交互 第一节 (java和js交互)
- 用C获得当前系统时间(转)
#include <stdio.h> #include <time.h> void main () { time_t rawtime; struct tm * timeinfo ...
- vc++ 加载,卸载自己的驱动程序
用vc++加载自己的驱动程序主要分为以下几个步骤: 1.加载驱动服务 主要要用到以下几个函数 SC_HANDLE WINAPI OpenSCManagerA( __in_opt LPCS ...
- java导出word的6种方式(复制来的文章)
来自: http://www.cnblogs.com/lcngu/p/5247179.html 最近做的项目,需要将一些信息导出到word中.在网上找了好多解决方案,现在将这几天的总结分享一下. 目前 ...
- php echo return exit 区别
echo.print().printf().sprintf().vardump().varexport():都可以输出内容到网页,但不退出函数或程序. return:返回并立即退出,函数级别. die ...