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, ...
随机推荐
- C#中线程间操作无效: 从不是创建控件 txtBOX 的线程访问它。
delegate void 委托名(方法名); void 方法名() { if(txtBox.invokeRequered) { 委托名 d=new 委托名(); txtBox.invoke(d); ...
- TP框架基础 (二) ---空控制器和空操作
通过之前的学习我们知道了index.php是一个入口文件,如果没有这个入口文件的话,我们需要自己创建! [视图模板文件创建] 视图模板文件存放发位置在: 里面没有模板文件 如果我们想要访问Login控 ...
- Python中文本文件读写操作的编码问题
Python中文本文件读写的编码问题 编码(encode): 我们输入的任何字符想要以文件(如.txt)的形式保存在计算机的硬盘上, 必须先经按照一定的规则编成计算机认识的二进制后,才能存在电脑硬盘上 ...
- jmeter环境变量
jmeter环境变量配置jmeter环境变量时,同时也需要配置Java变量(jdk最好使用1.7及1.7以上的版本)1.配置jdk环境变量安装jdk正常安装,一路默认就好,记住安装路径,配置环境变量时 ...
- Nginx服务器安全加固tips整理
公司各业务网站大多用到Nginx,花了点时间整理了一下Nginx服务器安全加固的各类tips. 默认配置文件和Nginx端口 /usr/local/nginx/conf/-Nginx配置文件目录,/u ...
- 【iOS】No suitable application records found
昨天提交 Apple 审核时遇到这个问题,如图: 原来是还没在 iTunes Connect 创建 APP ... 一时着急大意了…… 后来想想还真是脑子一时没反应过来……
- 【iOS】The identity used sign the executable is no longer valid.
之前就遇到过这个问题,如图: 今天又遇到了,证书过期的问题. 需要访问苹果开发者的官网 http://developer.apple.com 来解决. 参考:How to fix “The ident ...
- PYNQ上手笔记 | ① 启动Pynq
现在人工智能非常火爆,一般的教程都是为博硕生准备的,太难看懂了,分享一个非常适合小白入门的教程,不仅通俗易懂而且还很风趣幽默,点☞这里☜进入传送门~ = = = = 我是华丽的分割线 = ...
- TextView 使用详解
极力推荐文章:欢迎收藏 Android 干货分享 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以 ...
- 【Java例题】4.3 3. 使用Gauss消元法求解n元一次方程组的根,
3. 使用Gauss消元法求解n元一次方程组的根,举例,三元一次方程组:0.729x1+0.81x2+0.9x3=0.6867x1+x2+x3=0.83381.331x1+1.21x2+1.1x3=1 ...