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的排 ...
随机推荐
- win32创建控件的一些问题
在我们使用CreateWindow();像一般控件建Windows扩展控件的时候我们会发现控件没有创建成功 这是因为我们没有对Windows扩展控件库进行初始化,这要我们使用InitCommonCon ...
- 【Demo 0002】Java基础-语句
本章学习要点: 1. 掌握Java关健语句使用方法; 2. 理解与语句相关的关键字用法; 一.Java 关键语句 Java语句以及关联关键字与C完全相 ...
- Qt4在linux下的安装
1.下载SDK ftp://ftp.informatik.hu-berlin.de/pub/Mirrors/ftp.troll.no/QT/qtsdk/qt-sdk-linux-x86-opensou ...
- 【Error】JavaWeb: 严重: Failed to initialize end point associated with ProtocolHandler ["http-bio-8080"]
在MyEclipse中启动Tomcat时出现错误,错误信息例如以下: 严重: Failed to initialize end point associated with ProtocolHandle ...
- 调用一个系统命令,并读取它的输出值(使用QProcess.readAll)
下面我们再看一个更复杂的例子,调用一个系统命令,这里我使用的是 Windows,因此需要调用 dir:如果你是在 Linux 进行编译,就需要改成 ls 了. mainwindow.h #ifndef ...
- copy算法
copy------强化效率无所不用其极 copy(first,last,result)算法可将输入区间[first,last)内的元素拷贝到输出区间[result,result+(last-f ...
- Datatables 在asp.net mvc
Datatables 在asp.net mvc中的使用 前言 最近使用ABP(ASP.NET Boilerplate)做新项目,以前都是自己扩展一个HtmlHelper来完成同步/异步分页,但是有个地 ...
- TCP关闭过程
状态迁移 . SO_LINGER/ SO_REUSEADDR TCP正常的关闭过程如下(四次握手过程): (FIN_WAIT_1) A ---FIN---> B(CLOSE_WAIT) (FIN ...
- hdu 4888 Redraw Beautiful Drawings 最大流
好难好难,将行列当成X和Y,源汇点连接各自的X,Y集,容量为行列的和,相当于从源点流向每一行,然后分配流量给每一列,最后流入汇点,这样执意要推断最后是否满流,就知道有没有解,而解就是每一行流向每一列多 ...
- 读取USB HDD(USB移动硬盘信息)序列号的代码
读取USB HDD(USB移动硬盘)序列号的代码,型号及分位. 使用Visual Studio 2010编译成功. 代码使用了CrystalDiskInfo中的代码smartata.c中相关代码: 例 ...