其核心思想是记录最大的节点值和最低值,假设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当卡段树的更多相关文章

  1. HDU 6315.Naive Operations-线段树(两棵树合并)(区间单点更新、区间最值、区间求和)+思维 (2018 Multi-University Training Contest 2 1007)

    6315.Naive Operations 题意很好理解,但是因为区间求和求的是向下取整的a[i]/b[i],所以直接分数更新区间是不对的,所以反过来直接当a[i]==b[i]的时候,线段树对应的位置 ...

  2. hdu 4107 Gangster(线段树,时间卡得很严)

    这道题目的数据卡得好厉害. 题目明显是考察线段树延迟标记的,但是因为要考虑到p的值,这种延迟是有条件的:在该节点下所有的数据对于p都应该位于p的同一侧.要么都比p大,要么都比p小. 开始的时候我用一个 ...

  3. HDU ACM 4578 Transformation-&gt;段树-间隔的变化

    分析:复杂的经营分部树. 只有一个查询操作,这是要求[l,r]的数量之间p钍总和.并不是所有的查询所有节点,会议TLE.最好的是查询部件[a.b].所有这个区间值我们是平等的,即能返回(b-a+1)* ...

  4. HDU 4107 Gangster(线段树 特殊懒惰标记)

    两种做法. 第一种:标记区间最大值和最小值,若区间最小值>=P,则本区间+2c,若区间最大值<P,则本区间+c.非常简单的区间更新. 最后发一点牢骚:最后query查一遍就行,我这个2B竟 ...

  5. HDU 1394 Minimum Inversion Number (数据结构-段树)

    Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java ...

  6. HDU 6356.Glad You Came-线段树(区间更新+剪枝) (2018 Multi-University Training Contest 5 1007)

    6356.Glad You Came 题意就是给你一个随机生成函数,然后从随机函数里确定查询的左右区间以及要更新的val值.然后最后求一下异或和就可以了. 线段树,区间最大值和最小值维护一下,因为数据 ...

  7. HDU 5649.DZY Loves Sorting-线段树+二分-当前第k个位置的数

    DZY Loves Sorting Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Oth ...

  8. HDU 1542 Atlantis(线段树扫描线+离散化求面积的并)

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  9. 计蒜客 28437.Big brother said the calculation-线段树+二分-当前第k个位置的数 ( ACM训练联盟周赛 M)

    M. Big brother said the calculation 通过线段树维护. 这个题和杭电的一道题几乎就是一样的题目.HDU5649.DZY Loves Sorting 题意就是一个n的排 ...

随机推荐

  1. VC/MFC 在ListCtl 控件中随鼠标移动提示单元格信息

    BEGIN_MESSAGE_MAP(CTipListCtrl, CListCtrl) //{{AFX_MSG_MAP(CTipListCtrl) ON_WM_MOUSEMOVE() ON_WM_DES ...

  2. Lucene.Net 2.3.1开发介绍 —— 四、搜索(一)

    原文:Lucene.Net 2.3.1开发介绍 -- 四.搜索(一) 既然是内容筛选,或者说是搜索引擎,有索引,必然要有搜索.搜索虽然与索引有关,那也只是与索引后的文件有关,和索引的程序是无关的,因此 ...

  3. 450A - Jzzhu and Children 找规律也能够模拟

    挺水的一道题.规律性非常强,在数组中找出最大的数max,用max/m计算出倍数t,然后再把数组中的书都减去t*m,之后就把数组从后遍历找出第一个大于零的即可了 #include<iostream ...

  4. iphone之NSArray比较大小

    //排序 NSArray *tempArray = [[NSArray alloc]initWithArray:self.contentArray]; tempArray = [tempArray s ...

  5. 在防火墙的例外中注册程序(Windows7和XP),改写注册表

    在写程序的时候,经常遇到被防火墙拦截的情况,尤其是一些网络程序,不管是对外访问还是外部连接,都会被拦截. 在大多情况下,Windows会静默拦截外部对内的连接访问,而内部对外的访问会提示用户信息. 现 ...

  6. 桌面应用框架 OneRing

    框架目标 OneRing是一个跨平台的桌面应用框架.和Adobe AIR类似,它支持用html/js/css制作用户界面,与之不同的是,它的应用为本地程序,可以直接访问操作系统的数据. 架构 一个On ...

  7. asp.net(C#)之NPOI&quot;操作Excel

    1.首先到网上下载"NPOI.DLL".引用. 2.新建一个操作类"ExcelHelper.cs": using System.Collections.Gene ...

  8. 理解Lambda表达式

    1.什么是Lambda表达式 Lambda表达式是一个匿名方法,通常在LINQ中被用来创建委托 简单来说.它是一个没有声明,没有访问修饰符,没有返回值.甚至没有名字的方法. 2.为什么我们需要使用La ...

  9. 位运算之 C 与或非异或

    与运算:& 两者都为1为1,否则为0 1&1=1,  1&0=0,  0&1=0,  0&0=0   或运算:| 两者都为0为0,否则为1 1|1 = 1,   ...

  10. 事务应用-运行多条SQL语句

    事务具有原子性,要么不运行,要么全运行,一旦成功运行永久保存.而这些正是因为事务的原子性和对数据库的持久性形成的.下面是一个关于统一给数据库中的数据改动的批量操作,利用到事务. TODO:批量改动数据 ...