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的排 ...
随机推荐
- hadoop(六) - ZooKeeper安装与配置
一. ZooKeeper配置 1.使用winscp上传zk安装包 zookeeper-3.4.5.tar.gz 2.解压安装包tar -zxvf zookeeper-3.4.5.tar.gz -C / ...
- c#Enum的用法
public enum ResType { Role = 0, Dept = 1, Group = 2, Site = 3, Org = 4, Sub=8 } 这里定义了一个enum ResTy ...
- gtk+blade+anjuta 的简单实例
gtk+blade+anjuta 的简单实例我的系统 ubuntu 12.04 1> 选择源 不正确会有很多问题,速度慢,找不到安装的软件.163的源就不错 http://mirrors. ...
- Lisp: Common Lisp, Racket, Clojure, Emacs Lisp - Hyperpolyglot
Lisp: Common Lisp, Racket, Clojure, Emacs Lisp - Hyperpolyglot Lisp: Common Lisp, Racket, Clojure, E ...
- Python Object Graphs — objgraph 1.7.2 documentation
Python Object Graphs - objgraph 1.7.2 documentation Python Object Graphs¶ objgraph is a module that ...
- 通过Type.InvokeMethod实现方法的重载
版本:.NET Framework 3.5 先来一个反射调用方法的例子: using System; using System.Reflection; class Example { static v ...
- iOS 开发百问(6)
61.警告"addexplicit braces to avoid dangling else" 所谓"危急的else"是相似这种代码: if(a== 10) ...
- POJ2528 Mayor's posters 【线段树】+【成段更新】+【离散化】
Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 39795 Accepted: 11552 ...
- Android输入法扩展之外接键盘中文输入
大家想不想要这样一台Android Surface平板,看着就过瘾吧. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSVRsZWFrcw==/font/ ...
- Android Application Fundamentals——Android应用程序基础知识
Application Fundamentals--应用程序基础知识 Key classes--关键类 Activity Service BroadcastReceiver ContentProvid ...