HDU 6315
题意略。
思路:本题的思路总的来说就是暴力 + 剪枝。
我们依然用线段树来维护:
定义结点node{ l , r , minn , contirbute} 分别为某个区间的左右端点,和该区间(b序列)内的最小值与该区间对答案的贡献。
当我们修改到某一个区间的时候,如果该区间的minn > 1,那么minn--,并且给该区间打上懒标记。
如果该区间的minn == 1,那么我们看一下这个区间的左右两个子区间,对于minn > 1的子区间,我们就采取上面的操作。
对于minn == 1的子区间,我们就一直往下找,直到定位到了最底层的叶子节点,对于该子节点的minn,我们将它复原,但是把它的contribute += 1。
其实就是利用minn值来剪枝。
详见代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + ; struct node{
int l,r,minn,contri;
node(int a = ,int b = ,int c = ,int d = ){
l = a,r = b,minn = c,contri = d;
}
}; node store[maxn<<];
int depot[maxn],add[maxn<<],n,q;
char op[]; void pushup(int id){
store[id].contri = store[id<<].contri + store[id<< | ].contri;
store[id].minn = min(store[id<<].minn,store[id<< | ].minn);
}
void pushdown(int id){
if(add[id]){
store[id<<].minn -= add[id];
store[id<< | ].minn -= add[id];
add[id<<] += add[id];
add[id<< | ] += add[id];
add[id] = ;
}
}
void build(int l,int r,int id){
store[id].l = l,store[id].r = r;
if(l == r){
store[id].minn = depot[l];
store[id].contri = ;
return;
}
int mid = (l + r)>>;
build(l,mid,id<<);
build(mid + ,r,id<< | );
pushup(id);
}
void modify(int l,int r,int id){ if(store[id].l == l && store[id].r == r && store[id].minn > ){
store[id].minn -= ;
add[id] += ;
return;
}
if(store[id].l == store[id].r){
store[id].minn -= ;
add[id] += ;
if(store[id].minn <= ){
store[id].minn = depot[l];
store[id].contri += ;
}
return;
}
pushdown(id);
int mid = (store[id].l + store[id].r)>>;
if(r <= mid) modify(l,r,id<<);
else if(mid < l) modify(l,r,id<< | );
else{
modify(l,mid,id<<);
modify(mid + ,r,id<< | );
}
pushup(id);
}
int query(int l,int r,int id){
if(store[id].l == l && store[id].r == r){
return store[id].contri;
}
pushdown(id);
int mid = (store[id].l + store[id].r)>>;
int ret = ;
if(r <= mid) ret = query(l,r,id<<);
else if(mid < l) ret = query(l,r,id<< | );
else ret = query(l,mid,id<<) + query(mid + ,r,id<< | );
pushup(id);
return ret;
} int main(){
while(scanf("%d%d",&n,&q) == ){
memset(add,,sizeof(add));
for(int i = ;i <= n;++i){
scanf("%d",&depot[i]);
}
build(,n,);
for(int i = ;i < q;++i){
int l,r;
scanf("%s%d%d",op,&l,&r);
if(op[] == 'a'){
modify(l,r,);
}
else{
int ans = query(l,r,);
printf("%d\n",ans);
}
}
}
return ;
}
HDU 6315的更多相关文章
- HDU-DuoXiao第二场hdu 6315 Naive Operations 线段树
hdu 6315 题意:对于一个数列a,初始为0,每个a[ i ]对应一个b[i],只有在这个数字上加了b[i]次后,a[i]才会+1. 有q次操作,一种是个区间加1,一种是查询a的区间和. 思路:线 ...
- HDU - 6315(2018 Multi-University Training Contest 2) Naive Operations (线段树区间操作)
http://acm.hdu.edu.cn/showproblem.php?pid=6315 题意 a数组初始全为0,b数组为1-n的一个排列.q次操作,一种操作add给a[l...r]加1,另一种操 ...
- HDU 6315.Naive Operations-线段树(两棵树合并)(区间单点更新、区间最值、区间求和)+思维 (2018 Multi-University Training Contest 2 1007)
6315.Naive Operations 题意很好理解,但是因为区间求和求的是向下取整的a[i]/b[i],所以直接分数更新区间是不对的,所以反过来直接当a[i]==b[i]的时候,线段树对应的位置 ...
- 杭电多校第二场 hdu 6315 Naive Operations 线段树变形
Naive Operations Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 502768/502768 K (Java/Other ...
- HDU 6315 Naive Operations(线段树区间整除区间)
Problem DescriptionIn a galaxy far, far away, there are two integer sequence a and b of length n.b i ...
- hdu 6315 Naive Operations (2018 Multi-University Training Contest 2 1007)
Naive Operations Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 502768/502768 K (Java/Other ...
- HDU 6315 Naive Operations(线段树+区间维护)多校题解
题意:a数组初始全为0,b数组题目给你,有两种操作: 思路:dls的思路很妙啊,我们可以将a初始化为b,加一操作改为减一,然后我们维护一个最小值,一旦最小值为0,说明至少有一个ai > bi,那 ...
- 2018 Multi-University Training Contest 2-1007(hdu 6315)-题解
一.题意 给定一个元素个数为$N(1 \le N \le 10^5)$初始序列$a$和$b$,$a$序列的初始值全为$0$,$b$序列的初始值为$1$到$N$的一个排列.有$T(1 \le T \le ...
- HDU - 6315 吉司机线段树
题意:给出a,b数组,区间上两种操作,给\(a[L,R]\)+1s,或者求\(\sum_{i=l}^{r}a_i/b_i\) 一看就知道是吉司机乱搞型线段树(低配版),暴力剪枝就好 维护区间a的最大值 ...
- HDU - 6315 Naive Operations (线段树+思维) 2018 Multi-University Training Contest 2
题意:数量为N的序列a和b,a初始全为0,b为给定的1-N的排列.有两种操作:1.将a序列区间[L,R]中的数全部+1:2.查询区间[L,R]中的 ∑⌊ai/bi⌋(向下取整) 分析:对于一个位置i, ...
随机推荐
- IDEA及IDEA汉化包
IDEA 官网:http://www.jetbrains.com/idea/download/#section=windows IDEA社区版(百度云):http://pan.baidu.com/s/ ...
- Java EE.JSP.指令
JSP的指令是从JSP向Web容器发送消息,它用来设置页面的全局属性,如输出内容类型等. JSP的指令的格式为:<%@ 指令名 属性="属性值"%> 1.page指令 ...
- spark 源码分析之七--Spark RPC剖析之RpcEndPoint和RpcEndPointRef剖析
RpcEndpoint 文档对RpcEndpoint的解释:An end point for the RPC that defines what functions to trigger given ...
- D3学习之画布制作
最近大半个月都和d3斗争,学习艰辛(呜呜……)如果觉得作者写的对你有用,可以打赏作者哦!owo 起言:结合自己的学习之路,我认为要想使用d3画图搞清楚布局很重要,层次分明,就给了你很大的灵活性,写起代 ...
- python 感悟
* 优美胜于丑陋.* 显式胜于隐式.* 简单胜于复杂.* 复杂胜于难懂.* 扁平胜于嵌套.* 稀疏胜于紧密.* 可读性应当被重视.* 尽管实用性会打败纯粹性,特例也不能凌驾于规则之上.* 不要忽略任何 ...
- Linux系统管理----磁盘管理与文件系统
1.为主机新增两块30GB的SCSI硬盘 找到要添加的虚拟机,单击鼠标右键,点击设置 点击添加 选择硬件类型,然后点击下一步 选择要创建的磁盘类型,然后点击下一步 指定要创建磁盘的容量,然后点击下一步 ...
- MOCTF-Crypt-writeup
MOctf Crypt Writeup记录 都不难,就随便记录记录下. MOCTF平台地址:http://www.moctf.com 0x01 数据库密码 hint:20岁的小刚,自幼热爱信息安全,一 ...
- Linux基础文件权限
一.基本权限 文件权限设置: 可以赋于某个用户或组 能够以何种方式 访问某个文件 权限对象:属主: u属组: g其他人: o 基本权限类型:读:r 4写:w 2执行: x 1 rwx rw- r-- ...
- java高并发系列 - 第22天:java中底层工具类Unsafe,高手必须要了解
这是java高并发系列第22篇文章,文章基于jdk1.8环境. 本文主要内容 基本介绍. 通过反射获取Unsafe实例 Unsafe中的CAS操作 Unsafe中原子操作相关方法介绍 Unsafe中线 ...
- 转载:MyBatis mapper.xml中使用静态常量或者静态方法
转自:https://my.oschina.net/wtslh/blog/682704 今天偶然之间刷到了这样一篇博客,有点意外 mybatis 还可以这样使用ONGL常量的方式,该方式针对 xml的 ...