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, ...
随机推荐
- django中ORM的model对象和querryset 简单解析
欢迎大家查看我的博客,我会不定时的用大白话发一些看了就能懂的文章,大家多多支持!如您对此文章内容有独特见解,欢迎与笔者练习一起探讨学习!原创文创!转载请注明出处! ORM是干嘛的? 介绍orm之前我应 ...
- Python基础之用户交互、流程控制、循环语句
python的简洁性真的令人叹为观止,没有JAVA那种输入还要导个包,不学不知道,一学吓一跳啊! 我在学这些基础的时候,会把python和java.c做对比,这样更好的理解记忆! 用户交互(输入) i ...
- mpvue的使用,包含axios、router的集成等完美结合小程序
mpvue开发微信小程序框架的使用注意事项: 1.路由跳转,引用mpvue-router-patch 在main.js文件中引入控件:import MpvueRouterPatch from 'mpv ...
- Servlet的介绍
Servlet由来 做过BS项目的人都知道,浏览器能够根据HTML静态标记语言来显示各式各样的网页.但是如果我们需要在网页上完成一些业务逻辑:比如登陆验证.或者说网页显示的内容在服务器的数据库中.如果 ...
- linuk挂载命令
1 Linuk挂在命令如下(将一个目录下面的东西挂在到另一个目录上面) mount -bind -o rw /data/vsftpd/原目录 /data/vsftpd/目标目录 2 查看所有的挂载 ...
- 1.Java概述、安装及环境搭建
1. 前言 1.1 学习方法 1. 学会学习的方法 2. 学会独立解决问题 3. 主动的学习而不是被动的接受 4. 知识的大家的,能力才是自己的 1.2 推荐博客 当代程序员都应该养成写博客.看博客的 ...
- T-SQL 镜像测试
--====================================================== ----镜像计划建立 2016-05-10 17:05:16.463 hubiyun ...
- Linux 清理空间
背景: 在使用Linux服务器的时候,经常会碰到服务器上的磁盘空间满了,在该种情况下,必须进行磁盘空间清理. 解决方法: 示例:需要/tmp下空出至少1G的可用空间 分别执行的命令如下: df /tm ...
- (一)Mybatis基本配置,Statement方式,动态代理增删改查
首先明白Mybatis是干什么的,之前使用jdbc操作数据库时候要写很多语句,获取光标,连接,获取具体对象进行相应操作,代码过于繁琐,所以现在有了Mybatis,它将这个操作整合在了一起,你不需要关心 ...
- java基础精选题
Integer比较 看下面这段有意思的代码,对数字比较敏感的小伙伴有没有发现异常? public static void main(String[] args) { Integer a = 128,b ...