hdu6315 /// 线段树区间更新
题目大意:
给定n q 为序列的个数和操作的个数
给定n个数的序列b[]作为分母
初始全为0的序列a[]作为分子
两种操作
add l r 为a[]的l到r区间全部+1
query l r 为查询l到r区间a[i]/b[i]的总和(向下取整)
因为是向下取整 所以线段树维护区间的min(b[i]-a[i]%b[i])
那么当区间的这个最小的sub值为0时 说明这个区间内至少有一个点有新的贡献
所以当sub值为0时 才更新答案并向下更新 否则更新lazy和sub即可
即在代码中 更新lazy和sub 当sub恰好等于0 那么更新now
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define LL long long
#define mem(i,j) memset(i,j,sizeof(i))
using namespace std;
const int N=1e5+;
const int MOD=1e9+;
int n, m, b[N]; #define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
LL lazy[N<<], now[N<<], sub[N<<];
void pushUp(int rt) {
sub[rt]=min(sub[rt<<],sub[rt<<|]);
now[rt]=now[rt<<]+now[rt<<|];
}
void pushDown(int rt) {
if(lazy[rt]) {
lazy[rt<<]+=lazy[rt];
lazy[rt<<|]+=lazy[rt];
sub[rt<<]-=lazy[rt];
sub[rt<<|]-=lazy[rt];
lazy[rt]=;
}
}
void build(int l,int r,int rt) {
lazy[rt]=; now[rt]=;
if(l==r) {
sub[rt]=b[l];
return;
}
int m=(l+r)>>;
build(lson);
build(rson);
pushUp(rt);
}
void updatesub(int l,int r,int rt) {
if(l==r) {
now[rt]++; sub[rt]=b[l];
return;
}
pushDown(rt);
int m=(l+r)>>;
if(sub[rt<<]==) updatesub(lson);
if(sub[rt<<|]==) updatesub(rson);
pushUp(rt);
}
void update(int L,int R,int l,int r,int rt) {
if(L<=l && r<=R) {
lazy[rt]++; sub[rt]--;
if(sub[rt]==) updatesub(l,r,rt);
return;
}
pushDown(rt);
int m=(l+r)>>;
if(L<=m) update(L,R,lson);
if(m<R) update(L,R,rson);
pushUp(rt);
}
int query(int L,int R,int l,int r,int rt) {
if(L<=l && r<=R) return now[rt];
pushDown(rt);
int m=(l+r)>>;
int res=;
if(L<=m) res+=query(L,R,lson);
if(m<R) res+=query(L,R,rson);
return res;
}
void init() {
mem(now,); mem(sub,); mem(lazy,);
} int main()
{
while(~scanf("%d%d",&n,&m)) {
for(int i=;i<=n;i++) scanf("%d",&b[i]);
init(); build(,n,);
while(m--) {
char op[]; scanf("%s",op);
int l,r; scanf("%d%d",&l,&r);
if(op[]=='a') update(l,r,,n,);
else printf("%d\n",query(l,r,,n,));
}
} return ;
}
hdu6315 /// 线段树区间更新的更多相关文章
- HDU 1556 Color the ball(线段树区间更新)
Color the ball 我真的该认真的复习一下以前没懂的知识了,今天看了一下线段树,以前只会用模板,现在看懂了之后,发现还有这么多巧妙的地方,好厉害啊 所以就应该尽量搞懂 弄明白每个知识点 [题 ...
- hihoCoder 1080 : 更为复杂的买卖房屋姿势 线段树区间更新
#1080 : 更为复杂的买卖房屋姿势 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho都是游戏迷,“模拟都市”是他们非常喜欢的一个游戏,在这个游戏里面他们 ...
- HDU 5023 A Corrupt Mayor's Performance Art(线段树区间更新)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5023 解题报告:一面墙长度为n,有N个单元,每个单元编号从1到n,墙的初始的颜色是2,一共有30种颜色 ...
- HDU 4902 Nice boat 2014杭电多校训练赛第四场F题(线段树区间更新)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4902 解题报告:输入一个序列,然后有q次操作,操作有两种,第一种是把区间 (l,r) 变成x,第二种是 ...
- HDU 1698 线段树 区间更新求和
一开始这条链子全都是1 #include<stdio.h> #include<string.h> #include<algorithm> #include<m ...
- POJ-2528 Mayor's posters (线段树区间更新+离散化)
题目分析:线段树区间更新+离散化 代码如下: # include<iostream> # include<cstdio> # include<queue> # in ...
- ZOJ 1610 Count the Colors (线段树区间更新)
题目链接 题意 : 一根木棍,长8000,然后分别在不同的区间涂上不同的颜色,问你最后能够看到多少颜色,然后每个颜色有多少段,颜色大小从头到尾输出. 思路 :线段树区间更新一下,然后标记一下,最后从头 ...
- POJ 2528 Mayor's posters (线段树区间更新+离散化)
题目链接:http://poj.org/problem?id=2528 给你n块木板,每块木板有起始和终点,按顺序放置,问最终能看到几块木板. 很明显的线段树区间更新问题,每次放置木板就更新区间里的值 ...
- HDU5039--Hilarity DFS序+线段树区间更新 14年北京网络赛
题意:n个点的树,每个条边权值为0或者1, q次操作 Q 路径边权抑或和为1的点对数, (u, v)(v, u)算2个. M i修改第i条边的权值 如果是0则变成1, 否则变成0 作法: 我们可以求出 ...
随机推荐
- UVA_548Tree
这是一个很经典的建树,然而当时不会!!!! 给你一个中序和后序 先建一个二叉树,然后找最优解(最优解就是一个叶子节点到根节点权值最小, 同时本身权值最小) //生成一棵树 int build(int ...
- http常见状态码及其解析
HTTP状态码常见状态码及其解析 状态码 状态码英文名称 中文描述 100 Continue 继续.客户端应继续其请求 101 Switching Protocols 切换协议.服务器根据客户端的请求 ...
- Springboot的Mybatis逆向工程
1.pom.xml添加mybatis和逆向插件依赖: <dependency> <groupId>org.mybatis.spring.boot</groupId> ...
- 程序性能优化之APK大小优化(六)上
阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680 本篇文章将继续从APK瘦身来介绍APK大小优化:文章主要内容从理 ...
- DB2命令行查看执行计划
查看对应SQL的执行计划 分析程序包 db2expln -d 数据库名 -i -g -c 模式名-p程序包 -s 0 -t db2expln -d 数据库名 -i -g -c 模式名-p程序包 ...
- 深海Django少年
orm查询,如果遇到我之前的环境报错 就可去manage.py中拷贝前四行代码到tests文件中,然后增加两行代码: import django django.setup() 或者任意新建一个py文件 ...
- 進階gdb之core dump的除錯
core dump的除錯 Basic Perl等語言處理的可以說是User的資料, C可以說在那邊把資料在記憶體移來移去, 組語可說把資料在暫存器搬來搬去, 越低階的處理表示握有的資源越少 所以C處理 ...
- MockServer
基于Flask实现的一个简易Mock平台,使用标准json结构体编写Mock Api https://github.com/yinquanwang/MockServer Key Features ...
- Process Array
http://xiaorui.cc/2016/05/10/%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90multiprocessing%E7%9A%84value-array ...
- HDU-4747 二分+线段树
题意:给出长度为n的序列,问任两个区间的mex运算结果的总和. 解法:直接讲线段树做法:我们注意到mex(1,1),mex(1,2),mex(1,3)...mex(1,i)的结果是单调不减的,那么我们 ...