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/Others)
Total Submission(s): 887 Accepted Submission(s): 336
b is a static permutation of 1 to n. Initially a is filled with zeroes.
There are two kind of operations:
1. add l r: add one for al,al+1...ar
2. query l r: query ∑ri=l⌊ai/bi⌋
For each test case, in the first line, two integers n,q, representing the length of a,b and the number of queries.
In the second line, n integers separated by spaces, representing permutation b.
In the following q lines, each line is either in the form 'add l r' or 'query l r', representing an operation.
1≤n,q≤100000, 1≤l≤r≤n, there're no more than 5 test cases.
1 5 2 4 3
add 1 4
query 1 4
add 2 5
query 2 5
add 3 5
query 1 5
add 2 4
query 1 4
add 2 5
query 2 5
add 2 2
query 1 5
#include<bits/stdc++.h> using namespace std; #define ls (id<<1)
#define rs ((id<<1)|1)
#define mid ((l+r)>>1)
typedef long long LL; const int maxn=+;
int n,q;
int b[maxn];
struct Node{ int mina;
int valb;
int zero_sum;
int id;
int lazy; }node[maxn<<];
void pushdown(int id,int l,int r){//往下更新
node[ls].lazy+=node[id].lazy;
node[rs].lazy+=node[id].lazy;
node[ls].mina-=node[id].lazy;
node[rs].mina-=node[id].lazy;
node[id].lazy=;
}
void pushup(int id,int l,int r){//往上更新
node[id].zero_sum=node[ls].zero_sum+node[rs].zero_sum;
node[id].mina=min(node[ls].mina,node[rs].mina);
}
void build(int l,int r,int id){
node[id].zero_sum=node[id].lazy=;
if(l==r){ node[id].valb=node[id].mina=b[l];
//cout<<"id=="<<id<<" l=="<<l<<" r=="<<r<<"node[id].mina="<<node[id].mina<<endl;
return;
}
build(l,mid,ls);
build(mid+,r,rs);
pushup(id,l,r);
}
void update(int l,int r,int id,int ql,int qr){
//cout<<"id=="<<id<<" l=="<<l<<" r=="<<r<<"node[id].mina="<<node[id].mina<<endl;
if(l>r)return;
if(node[id].mina>&&ql<=l&&qr>=r){///到时候修改一下!!有包含的区间并且不存在要为0的叶子节点;
node[id].lazy++;
node[id].mina--;
return;
}
if(l==r&&node[id].mina==){//正好整除的叶子节点
node[id].zero_sum++;
node[id].lazy=;
node[id].mina=node[id].valb;
return;
}
if(node[id].lazy)pushdown(id,l,r);
if(qr<=mid)update(l,mid,ls,ql,qr);
else if(ql>mid)update(mid+,r,rs,ql,qr);
else{
update(l,mid,ls,ql,qr);
update(mid+,r,rs,ql,qr);
}
pushup(id,l,r);
}
int query(int l,int r,int id,int ql,int qr){
// cout<<"id=="<<id<<" l=="<<l<<" r=="<<r<<"node[id].mina="<<node[id].mina<<endl;
if(l>r)return ;
if(ql<=l&&r<=qr)return node[id].zero_sum;//被需要查询包含的区间;
/*if (node[id].mina <= 0) {
update(1, 1, n, ql, qr);
}*/
if(qr<=mid)return query(l,mid,ls,ql,qr);
else if(ql>mid)return query(mid+,r,rs,ql,qr);
else{
return query(l,mid,ls,ql,qr)+query(mid+,r,rs,ql,qr);
}
}
int main()
{
std::ios::sync_with_stdio(false);
while(cin>>n>>q){
for(int i=;i<=n;i++)cin>>b[i];
build(,n,);
while(q--){
char s[];
int ll,rr;
cin>>s>>ll>>rr;
if(s[]=='a')update(,n,,ll,rr);
else
cout<<query(,n,,ll,rr)<<endl;
}
}
return ;
}
HDU-6315 Naive Operations//2018 Multi-University Training Contest 2___1007 (线段树,区间除法)的更多相关文章
- HDU 4509 湫湫系列故事——减肥记II(线段树-区间覆盖 或者 暴力技巧)
http://acm.hdu.edu.cn/showproblem.php?pid=4509 题目大意: 中文意义,应该能懂. 解题思路: 因为题目给的时间是一天24小时,而且还有分钟.为了解题方便, ...
- 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 线段树变形
Naive Operations Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 502768/502768 K (Java/Other ...
- HDU 6315: Naive Operations
Naive Operations Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 502768/502768 K (Java/Other ...
- HDU-DuoXiao第二场hdu 6315 Naive Operations 线段树
hdu 6315 题意:对于一个数列a,初始为0,每个a[ i ]对应一个b[i],只有在这个数字上加了b[i]次后,a[i]才会+1. 有q次操作,一种是个区间加1,一种是查询a的区间和. 思路:线 ...
- 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
题意:数量为N的序列a和b,a初始全为0,b为给定的1-N的排列.有两种操作:1.将a序列区间[L,R]中的数全部+1:2.查询区间[L,R]中的 ∑⌊ai/bi⌋(向下取整) 分析:对于一个位置i, ...
- HDU 6315 Naive Operations(线段树+区间维护)多校题解
题意:a数组初始全为0,b数组题目给你,有两种操作: 思路:dls的思路很妙啊,我们可以将a初始化为b,加一操作改为减一,然后我们维护一个最小值,一旦最小值为0,说明至少有一个ai > bi,那 ...
- HDU 6315 Naive Operations(线段树+复杂度均摊)
发现每次区间加只能加1,最多全局加\(n\)次,这样的话,最后的答案是调和级数为\(nlogn\),我们每当答案加1的时候就单点加,最多加\(nlogn\)次,复杂度可以得当保证. 然后问题就是怎么判 ...
随机推荐
- USACO Section1.5 Superprime Rib 解题报告
sprime解题报告 —— icedream61 博客园(转载请注明出处)--------------------------------------------------------------- ...
- Python 3基础教程4-变量
本文介绍变量,什么是变量呢,可以这样理解:变量是一个容器,这个容器可以用来存储值,而且可以被其他对象引用. 看看下面的demo.py # 这里介绍 变量 # 变量可以是数字var1 = 5print( ...
- Python全栈工程师(装饰器、模块)
ParisGabriel 每天坚持手写 一天一篇 决定坚持几年 全栈工程师 Python人工智能从入门到精通 装饰器 decorators(专业提高篇) 装饰 ...
- 孤荷凌寒自学python第十八天python变量的作用范围
孤荷凌寒自学python第十八天python函数的形参与变量的范围 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.在python的函数中各种不同的形式参数在定义的先后顺序上有规定: 必须 ...
- AppCan试用体验
最近自己想开发一个基于Android平台的小应用,但不想使用JAVA开发,还要快速实现功能,学习成本低. 所以找了很多框架,最后基本锁定在phoneGap和AppCan,又看了AppCan与phone ...
- HDU 3336 Count the string ( KMP next函数的应用 + DP )
dp[i]代表前i个字符组成的串中所有前缀出现的次数. dp[i] = dp[next[i]] + 1; 因为next函数的含义是str[1]~str[ next[i] ]等于str[ len-nex ...
- fragment中的WebView返回上一页
public final class Text1Fm extends Fragment { static WebView mWeb; private View mContentView; privat ...
- BZOJ 1912:[Apio2010]patrol 巡逻(树直径)
1912: [Apio2010]patrol 巡逻 Input 第一行包含两个整数 n, K(1 ≤ K ≤ 2).接下来 n – 1行,每行两个整数 a, b, 表示村庄a与b之间有一条道路(1 ≤ ...
- Linux命令 -磁盘和文件系统类
声明:本文所涉及到的Linux命令均为最常见的用法,未列举之参数,自行查阅man 1.df 磁盘容量 -h 以人类易读方式展示(GB.KB)等 df -h /usr 2.du 文件或目录的容量 -s ...
- 整数拆分 [dp+多项式插值]
题意 $1 \leq n \leq 10^{18}$ $2 \leq m \leq 10^{18}$ $1 \leq k \leq 20$ 思路 n,m较小 首先考虑朴素的$k=1$问题: $f[i] ...