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 内存限制: ...
随机推荐
- MongoDB增删查改
1.insert db.Customers.insert({ "DateTest":new Date(), "IntTest":32, "Double ...
- ***CI的CLI运行方式
linux下的执行命令: 1.PHP解释器 2.CI根目录的index.php 3.控制器所在的文件夹 4. 控制器名称 5. 方法名称 (参数) 参考文献: http://codeigni ...
- 【mysql创建用户|删除用户|修改用户权限|常用命令】
原文链接:http://blog.csdn.net/leili0806/article/details/8573636 1. CREATE USER 语法: CREATE USER 'us ...
- android 入门-android Studio 快捷输入
1.输入 log的时候按一下Tab.就会打出 private static final String TAG="Settings"; 2. shift +alt+x 运行 shif ...
- 在Salesforce中通过编写C#程序调用dataloadercliq的bat文件取触发调用data loader来批量处理数据
通过这篇文章 http://www.cnblogs.com/mingmingruyuedlut/p/3413903.html 我们已经知道了Data Loader可以对Salesforce的Objec ...
- loj 1030概率dp
题目链接:http://lightoj.com/volume_showproblem.php?problem=1030 思路:一直以来对这种概率题都挺感冒的=.=......还是说一下思路吧,dp[i ...
- loj 1379(最短路变形)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=27087 思路:题目的意思是求S->T的所有路径中花费总和小于 ...
- java学习笔记(3):网络编程
基本原理 客户端要发起通信,首先得知道运行服务器程序主机的IP地址,然后由网络的基础结构利用目标地址,将发送的信息传递到正确的主机上.地址可以是数字型(IPv4或者IPv6),也可以是字符串(必须先被 ...
- Linux(centos)如何安装Zend Optimizer Zend Guard Loader
很多php开源系统都是基于Zend Optimizer的,所以我们需要先安装Zend Optimizer.但在php5.3之后Zend Optimizer被Zend Guard Loader 取代了, ...
- Java学习随笔1:Java是值传递还是引用传递?
Java always passes arguments by value NOT by reference. Let me explain this through an example: publ ...