题意略。

思路:本题的思路总的来说就是暴力 + 剪枝。

我们依然用线段树来维护:

定义结点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的更多相关文章

  1. HDU-DuoXiao第二场hdu 6315 Naive Operations 线段树

    hdu 6315 题意:对于一个数列a,初始为0,每个a[ i ]对应一个b[i],只有在这个数字上加了b[i]次后,a[i]才会+1. 有q次操作,一种是个区间加1,一种是查询a的区间和. 思路:线 ...

  2. 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,另一种操 ...

  3. HDU 6315.Naive Operations-线段树(两棵树合并)(区间单点更新、区间最值、区间求和)+思维 (2018 Multi-University Training Contest 2 1007)

    6315.Naive Operations 题意很好理解,但是因为区间求和求的是向下取整的a[i]/b[i],所以直接分数更新区间是不对的,所以反过来直接当a[i]==b[i]的时候,线段树对应的位置 ...

  4. 杭电多校第二场 hdu 6315 Naive Operations 线段树变形

    Naive Operations Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 502768/502768 K (Java/Other ...

  5. HDU 6315 Naive Operations(线段树区间整除区间)

    Problem DescriptionIn a galaxy far, far away, there are two integer sequence a and b of length n.b i ...

  6. 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 ...

  7. HDU 6315 Naive Operations(线段树+区间维护)多校题解

    题意:a数组初始全为0,b数组题目给你,有两种操作: 思路:dls的思路很妙啊,我们可以将a初始化为b,加一操作改为减一,然后我们维护一个最小值,一旦最小值为0,说明至少有一个ai > bi,那 ...

  8. 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 ...

  9. HDU - 6315 吉司机线段树

    题意:给出a,b数组,区间上两种操作,给\(a[L,R]\)+1s,或者求\(\sum_{i=l}^{r}a_i/b_i\) 一看就知道是吉司机乱搞型线段树(低配版),暴力剪枝就好 维护区间a的最大值 ...

  10. 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, ...

随机推荐

  1. JavaScript数组高性能去重解决方案

    在大多数的人眼里,数组去重是一个很简单的课题,很多人甚至熟练掌握了多种数组去重的方法,然而大多时候,我们却忽略了数组去重所消耗的时间资源.譬如我们在做前端性能优化的时候,又有多少人会考虑JavaScr ...

  2. sql server还原数据库(请选择用于还原的备份集)

    还原数据库的时候明明选择了备份集,还是提示未选择还原的备份集 后来查了下,是因为我本地有两个数据库(2008R2和2014),对应的两个数据库实例.而还原bak是sqlserver2014的备份,我默 ...

  3. js - 原生ajax访问后台读取数据并显示在页面上

    1.前台调用ajax访问后台方法,并接收数据 <%@ page contentType="text/html;charset=UTF-8" language="ja ...

  4. kubernetes CRD 开发指南

    扩展kubernetes两个最常用最需要掌握的东西:自定义资源CRD 和 adminsion webhook, 本文教你如何十分钟掌握CRD开发. kubernetes允许用户自定义自己的资源对象,就 ...

  5. python 读取文件1

    1.脚本 from sys import argv script,filename = argv txt = open(filename) print ("the filename is % ...

  6. netty使用EmbeddedChannel对channel的出入站进行单元测试

    一种特殊的Channel实现----EmbeddedChannel,它是Netty专门为改进针对ChannelHandler的单元测试而提供的. 名称 职责 writeInbound 将入站消息写到E ...

  7. 曹工杂谈:Linux服务器上,Spring Boot 原地修改 jar 包配置文件/替换class文件,免去重复上传的麻烦

    一.前言 相信很多同学有这样的需求,现在很多公司都有多地的研发中心,经常需要跨地区部署,比如,博主人在成都,但是服务器是北京的.一般城市间网络都不怎么好,上传一个几十兆的jar包那是真的慢,别说现在微 ...

  8. dubbo异常处理

    dubbo异常处理 我们的项目使用了dubbo进行不同系统之间的调用. 每个项目都有一个全局的异常处理,对于业务异常,我们会抛出自定义的业务异常(继承RuntimeException). 全局的异常处 ...

  9. xpath beautiful pyquery三种解析库

    这两天看了一下python常用的三种解析库,写篇随笔,整理一下思路.太菜了,若有错误的地方,欢迎大家随时指正.......(conme on.......) 爬取网页数据一般会经过 获取信息-> ...

  10. kubeadm源码分析

    k8s离线安装包 三步安装,简单到难以置信 kubeadm源码分析 说句实在话,kubeadm的代码写的真心一般,质量不是很高. 几个关键点来先说一下kubeadm干的几个核心的事: kubeadm ...