hdu 4107当卡段树
其核心思想是记录最大的节点值和最低值,假设max<p要么min>=p时间,在节点只变化add值,不要子树遍历;否则,就往子树递归。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector> using namespace std; const int maxn = 2e5+50;
int N, P; struct node{
int l, r, Min, Max, add;
int mid() { return (l+r)/2; }
}tree[maxn<<2]; int p, n;
void buildTree(int l, int r, int rt)
{
tree[rt].l = l;
tree[rt].r = r;
tree[rt].add = 0;
tree[rt].Min = 0;
tree[rt].Max = 0;
if(l == r) return ;
int mid = tree[rt].mid();
buildTree(l, mid, rt<<1);
buildTree(mid+1, r, rt<<1|1);
} void update(int l, int r, int rt, int L, int R, int add)
{
if(L <= l && R >= r)
{
if(tree[rt].Max < P)
{
tree[rt].add += add;
tree[rt].Min += add;
tree[rt].Max += add;
return ;
}
else if(tree[rt].Min >= P)
{
tree[rt].add += 2*add;
tree[rt].Min += 2*add;
tree[rt].Max += 2*add;
return ;
}
}
if(tree[rt].add){
tree[rt<<1].add += tree[rt].add;
tree[rt<<1].Min += tree[rt].add;
tree[rt<<1].Max += tree[rt].add;
tree[rt<<1|1].add += tree[rt].add;
tree[rt<<1|1].Min += tree[rt].add;
tree[rt<<1|1].Max += tree[rt].add; tree[rt].add = 0;
}
if(l == r) return ;
int mid = tree[rt].mid();
if(L <= mid) update(l, mid, rt<<1, L, R, add);
if(R > mid) update(mid+1, r, rt<<1|1, L, R, add); tree[rt].Min = min(tree[rt<<1].Min, tree[rt<<1|1].Min);
tree[rt].Max = max(tree[rt<<1].Max, tree[rt<<1|1].Max);
} void query(int l, int r, int rt)
{
if(tree[rt].Min == tree[rt].Max){
for(int i = l; i <= r; i ++)
printf( i == N ? "%d\n" : "%d ", tree[rt].Min );
return ;
}
if(tree[rt].add)
{
tree[rt<<1].add += tree[rt].add;
tree[rt<<1].Min += tree[rt].add;
tree[rt<<1].Max += tree[rt].add;
tree[rt<<1|1].add += tree[rt].add;
tree[rt<<1|1].Min += tree[rt].add;
tree[rt<<1|1].Max += tree[rt].add; tree[rt].add = 0;
}
if(l == r) return ;
int mid = tree[rt].mid();
query(l, mid, rt<<1);
query(mid+1, r, rt<<1|1);
} int main()
{
int n, m, p;
int a, b, c;
while(~scanf("%d%d%d", &n, &m, &p))
{
N = n;
P = p;
buildTree(1, n, 1);
for(int i = 0; i < m; i ++)
{
scanf("%d%d%d", &a, &b, &c);
update(1, n, 1, a, b, c);
}
query(1, n, 1);
}
}
hdu 4107当卡段树的更多相关文章
- HDU 6315.Naive Operations-线段树(两棵树合并)(区间单点更新、区间最值、区间求和)+思维 (2018 Multi-University Training Contest 2 1007)
6315.Naive Operations 题意很好理解,但是因为区间求和求的是向下取整的a[i]/b[i],所以直接分数更新区间是不对的,所以反过来直接当a[i]==b[i]的时候,线段树对应的位置 ...
- hdu 4107 Gangster(线段树,时间卡得很严)
这道题目的数据卡得好厉害. 题目明显是考察线段树延迟标记的,但是因为要考虑到p的值,这种延迟是有条件的:在该节点下所有的数据对于p都应该位于p的同一侧.要么都比p大,要么都比p小. 开始的时候我用一个 ...
- HDU ACM 4578 Transformation->段树-间隔的变化
分析:复杂的经营分部树. 只有一个查询操作,这是要求[l,r]的数量之间p钍总和.并不是所有的查询所有节点,会议TLE.最好的是查询部件[a.b].所有这个区间值我们是平等的,即能返回(b-a+1)* ...
- HDU 4107 Gangster(线段树 特殊懒惰标记)
两种做法. 第一种:标记区间最大值和最小值,若区间最小值>=P,则本区间+2c,若区间最大值<P,则本区间+c.非常简单的区间更新. 最后发一点牢骚:最后query查一遍就行,我这个2B竟 ...
- HDU 1394 Minimum Inversion Number (数据结构-段树)
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- HDU 6356.Glad You Came-线段树(区间更新+剪枝) (2018 Multi-University Training Contest 5 1007)
6356.Glad You Came 题意就是给你一个随机生成函数,然后从随机函数里确定查询的左右区间以及要更新的val值.然后最后求一下异或和就可以了. 线段树,区间最大值和最小值维护一下,因为数据 ...
- HDU 5649.DZY Loves Sorting-线段树+二分-当前第k个位置的数
DZY Loves Sorting Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Oth ...
- HDU 1542 Atlantis(线段树扫描线+离散化求面积的并)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- 计蒜客 28437.Big brother said the calculation-线段树+二分-当前第k个位置的数 ( ACM训练联盟周赛 M)
M. Big brother said the calculation 通过线段树维护. 这个题和杭电的一道题几乎就是一样的题目.HDU5649.DZY Loves Sorting 题意就是一个n的排 ...
随机推荐
- smartforms长文本处理方式
因为长文本的话不好换行,在smartforms中对于长文本的处理有两种:一种是自定义文本模板,自己定义好的文本格式,然后再使用的时候再文本类型中选择文本模板,最好是勾上如果没有文本存在怎无错误.这种方 ...
- Delphi XE7 用indy开发微信公众平台所有功能(10篇博客)
http://www.cnblogs.com/devinlee/p/4282498.html http://www.cnblogs.com/devinlee/p/4565933.html
- 细说UI线程和Windows消息队列
在 Windows应用程序中,窗体是由一种称为“ UI线程( User Interface Thread)”的特殊类型的线程创建的. 首先, UI线程是一种“线程”,所以它具有一个线程应该具有的所有特 ...
- 使用ThinkPHP+Uploadify实现图片上传功能
首先,将下载的Uploadify压缩包解压放到公共文件夹内.实现代码如下: 前台html部分: <script src="/uploadify/jquery.min.js" ...
- 存储的几个LUN问题
存储的几个LUN问题 . ---整理自EMC论坛 1. Linux中如何识别LUN?(AIX是否也差不多) 当创建好LUN并建好storage group后,主机(linux)可以直接用fdisk - ...
- 使用ANR-WatchDog来检測ANR
使用开源项目ANR-WatchDog来检測ANR.下载链接为:https://github.com/SalomonBrys/ANR-WatchDog Eclipse版本号仅仅需下载相应的jar包.在主 ...
- Codeforces Round #275 (Div. 2) C - Diverse Permutation (构造)
题目链接:Codeforces Round #275 (Div. 2) C - Diverse Permutation 题意:一串排列1~n.求一个序列当中相邻两项差的绝对值的个数(指绝对值不同的个数 ...
- C语言之基本算法35—数组上三角之积 主对角之积 副对角之积
//数组算法 /* ============================================================= 题目:求四阶矩阵上三角之积.主对角之积,副对角之积: 如 ...
- extern 使用方法具体解释
在C语言中,修饰符extern用在变量或者函数的声明前,用来说明"此变量/函数是在别处定义的.要在此处引用".(extern能够置于变量或者函数前,以标示变量或者函数的定义在别的文 ...
- GitHub上最受欢迎的Android开源项目TOP20
以下这些开源项目都是从GitHub上筛选的,我强烈推荐android程序源代码有时间的时候自己在上面淘淘,或许能发现自己须要的开源程序. 了解开源项目有两个优点: 1.借鉴代码,一般来说.火爆的开源项 ...