其核心思想是记录最大的节点值和最低值,假设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. hadoop(六) - ZooKeeper安装与配置

    一. ZooKeeper配置 1.使用winscp上传zk安装包 zookeeper-3.4.5.tar.gz 2.解压安装包tar -zxvf zookeeper-3.4.5.tar.gz -C / ...

  2. c#Enum的用法

    public enum ResType { Role = 0, Dept = 1, Group = 2, Site = 3, Org = 4, Sub=8 } 这里定义了一个enum    ResTy ...

  3. gtk+blade+anjuta 的简单实例

    gtk+blade+anjuta 的简单实例我的系统 ubuntu 12.04   1>  选择源 不正确会有很多问题,速度慢,找不到安装的软件.163的源就不错 http://mirrors. ...

  4. Lisp: Common Lisp, Racket, Clojure, Emacs Lisp - Hyperpolyglot

    Lisp: Common Lisp, Racket, Clojure, Emacs Lisp - Hyperpolyglot Lisp: Common Lisp, Racket, Clojure, E ...

  5. Python Object Graphs — objgraph 1.7.2 documentation

    Python Object Graphs - objgraph 1.7.2 documentation Python Object Graphs¶ objgraph is a module that ...

  6. 通过Type.InvokeMethod实现方法的重载

    版本:.NET Framework 3.5 先来一个反射调用方法的例子: using System; using System.Reflection; class Example { static v ...

  7. iOS 开发百问(6)

    61.警告"addexplicit braces to avoid dangling else" 所谓"危急的else"是相似这种代码: if(a== 10) ...

  8. POJ2528 Mayor&#39;s posters 【线段树】+【成段更新】+【离散化】

    Mayor's posters Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 39795   Accepted: 11552 ...

  9. Android输入法扩展之外接键盘中文输入

    大家想不想要这样一台Android  Surface平板,看着就过瘾吧. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSVRsZWFrcw==/font/ ...

  10. Android Application Fundamentals——Android应用程序基础知识

    Application Fundamentals--应用程序基础知识 Key classes--关键类 Activity Service BroadcastReceiver ContentProvid ...