HDU 6315 Naive Operations(线段树+复杂度均摊)
发现每次区间加只能加1,最多全局加\(n\)次,这样的话,最后的答案是调和级数为\(nlogn\),我们每当答案加1的时候就单点加,最多加\(nlogn\)次,复杂度可以得当保证。
然后问题就是怎么判断答案是否该加1。我们可以用线段树设初值为给出的排列,把区间加改成区间减,维护最小值。当最小值为0是遍历左右子树,找到该加1的节点,一共会找\(nlongn\)次复杂度也可以得到保证。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=101001;
int n,a[N],ned[N*9],lazy[N*9],tr[N],m;
int read(){
int sum=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
return sum*f;
}
int lowbit(int x){
return x&-x;
}
void add(int x,int c){
for(int i=x;i<=n;i+=lowbit(i))tr[i]+=c;
}
int getsum(int x){
int tmp=0;
for(int i=x;i;i-=lowbit(i))tmp+=tr[i];
return tmp;
}
void update(int now){
ned[now]=min(ned[now*2],ned[now*2+1]);
}
void build(int l,int r,int now){
lazy[now]=0;
if(l==r){
ned[now]=a[l];
return;
}
int mid=(l+r)>>1;
build(l,mid,now*2);
build(mid+1,r,now*2+1);
update(now);
}
void pushdown(int l,int r,int now){
if(lazy[now]==0)return;
if(l==r)return;
ned[now*2]+=lazy[now];
ned[now*2+1]+=lazy[now];
lazy[now*2]+=lazy[now];
lazy[now*2+1]+=lazy[now];
lazy[now]=0;
}
void add(int l,int r,int L,int R,int now){
pushdown(l,r,now);
if(l==L&&r==R){
if(ned[now]==1){
if(l==r){add(l,1);ned[now]=a[l];return;}
int mid=(l+r)>>1;
add(l,mid,L,mid,now*2);
add(mid+1,r,mid+1,R,now*2+1);
update(now);
return;
}
lazy[now]--;
ned[now]--;
return;
}
int mid=(l+r)>>1;
if(L>mid)add(mid+1,r,L,R,now*2+1);
else if(R<=mid)add(l,mid,L,R,now*2);
else add(l,mid,L,mid,now*2),add(mid+1,r,mid+1,R,now*2+1);
update(now);
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF){
for(int i=1;i<=n;i++)a[i]=read();
memset(tr,0,sizeof(tr));
build(1,n,1);
char s[10];
while(m--){
scanf("%s",s);
int l=read(),r=read();
if(s[0]!='a'){
printf("%d\n",getsum(r)-getsum(l-1));
}
else add(1,n,l,r,1);
}
}
return 0;
}
HDU 6315 Naive Operations(线段树+复杂度均摊)的更多相关文章
- 杭电多校第二场 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-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 (线段树+思维) 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, ...
- HDU6315 Naive Operations(线段树 复杂度分析)
题意 题目链接 Sol 这题关键是注意到题目中的\(b\)是个排列 那么最终的答案最多是\(nlogn\)(调和级数) 设\(d_i\)表示\(i\)号节点还需要加\(d_i\)次才能产生\(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(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(线段树+区间维护)多校题解
题意:a数组初始全为0,b数组题目给你,有两种操作: 思路:dls的思路很妙啊,我们可以将a初始化为b,加一操作改为减一,然后我们维护一个最小值,一旦最小值为0,说明至少有一个ai > bi,那 ...
- hdu Naive Operations 线段树
题目大意 题目链接Naive Operations 题目大意: 区间加1(在a数组中) 区间求ai/bi的和 ai初值全部为0,bi给出,且为n的排列,多组数据(<=5),n,q<=1e5 ...
随机推荐
- Sublime 是自动检测而非自动设置缩进
以为是自动设置规范化的缩进 以前一直认为是:识别出文件类型后,设置统一的缩进规范.比如说 识别为CSS,就把缩进设成2个空格 其实是自动检测然后与你保持统一 亲测发现,根据你文本里用的是几个空格的缩进 ...
- Unity 三维软件单位导入资源单位比例
三维软件 内部米制尺寸/m 默认设置导入unity中的尺寸/m 与unity单位比例 Maya 1 100 1:100 3DS MAX 1 0.01 100:1 Cinema 4D 1 100 1:1 ...
- ZBrush软件特性之Stencil模板调控板
在ZBrush中使用Stencil模板我们了解的所有绘图工具,通过它确定模板周围与涂画或模型的位置.本文将详解ZBrush®中如何使用“曲线板”自定义形状. 使用模版 ZBrush模版的作用象我们了解 ...
- 洛谷P1816 忠诚 分块
分块真的是很暴力呀… 暴力查询左端,暴力查询又端点,中间整体部分直接 $O(1)$ 求出. 注意编程细节:belong[i]=(i−1)/block+1,这样可以保证序列被分成这样的: Code: # ...
- HTML特殊符号对照表、常用的字符实体
来源:http://tool.xker.com/htmlchar.php 最常用的字符实体 显示结果 描述 实体名称 实体编号 空格 < 小于号 < < > 大于号 ...
- [Codeforces 626F]Group Projects
题目大意: 给定\(n\)个数\(a[1]\sim a[n]\),让你把它分为若干个集合,使每个集合内最大值与最小值的差的总和不超过\(K\).问总方案数. 解题思路: 一道很神的dp题. 首先将数进 ...
- PHP下的异步尝试一:初识生成器
PHP下的异步尝试系列 PHP下的异步尝试一:初识生成器 PHP下的异步尝试二:初识协程 PHP下的异步尝试三:协程的PHP版thunkify自动执行器 PHP下的异步尝试四:PHP版的Promise ...
- Django REST Framework - 分页 - 渲染器 - 解析器
为什么要使用分页? 我们数据表中可能会有成千上万条数据,当我们访问某张表的所有数据时,我们不太可能需要一次把所有的数据都展示出来,因为数据量很大,对服务端的内存压力比较大还有就是网络传输过程中耗时也会 ...
- [转]Python常用字符串
转自:http://blog.csdn.net/daemonpei/article/details/6325762 字符串相关操作: + :string1+string2 #联接字符串,将后一个串链接 ...
- How-to-quick-getting-started-for-Frontend
一转眼已一年多不专注前端方面的开发工作,这一年前端方面的技术又是新天地,偶然接到内部团队邀请我给他们做一个前端的讲座,希望能帮助他们快速.且深刻了解前端这个行业以及行业内的知识,这可真有点让我为难,由 ...