题意:数量为N的序列a和b,a初始全为0,b为给定的1-N的排列。有两种操作:1.将a序列区间[L,R]中的数全部+1;2.查询区间[L,R]中的 ∑⌊ai/bi⌋(向下取整)

分析:对于一个位置i,如果ai<bi,那么该位置不能对结果做出贡献;而当某一次操作后,ai>=bi了,就对结果的贡献值+1。那么可以用在线段树的结点中维护每个区间的最大a和最小b,和已经产生的贡献cnt。如果一个区间中最大的a超过了b,那么就说明此次更新操作使该区间的结果产生了变化,那么就要向下找到那个产生贡献的位置。当更新完结果值以后,就将这个位置上的bi再加上bi(由于结果要求向下取整),那么相当于这个位置的ai又要重新更新bi次才能再次产生贡献。

所以,update函数中,如果出现a>=b的情况,那么我们必须递归到最底层找到出现;如果a<b,那么只要打上延迟标记即可。

#include<bits/stdc++.h>
#define Lson rt<<1,l,m
#define Rson rt<<1|1,m+1,r
using namespace std;
typedef long long LL;
const int maxn =1e5+;
struct Node{
int cnt,addv,maxa,minb;
}tree[maxn<<];
int b[maxn];
void pushup(int rt)
{
tree[rt].cnt = tree[rt<<].cnt+tree[rt<<|].cnt;
tree[rt].maxa = max(tree[rt<<].maxa,tree[rt<<|].maxa);
tree[rt].minb = min(tree[rt<<].minb,tree[rt<<|].minb);
}
void pushdown(int rt)
{
if(tree[rt].addv){
int v=tree[rt].addv;
tree[rt].addv=;
tree[rt<<].maxa+=v;
tree[rt<<|].maxa+=v;
tree[rt<<].addv+=v;
tree[rt<<|].addv+=v;
}
}
void build(int rt,int l,int r)
{
tree[rt].addv=;
if(l==r){
tree[rt].cnt = tree[rt].maxa = ;
tree[rt].minb = b[l];
return;
}
int m = (l+r)>>;
build(Lson);
build(Rson);
pushup(rt);
}
void update(int rt,int l,int r,int L,int R)
{
if(L<=l && R>=r){
tree[rt].maxa++;
if(tree[rt].maxa<tree[rt].minb){ //还没有元素做出贡献
tree[rt].addv++;
return;
}
else if(l==r){
tree[rt].cnt++;
tree[rt].minb+=b[l];
return;
}
}
pushdown(rt);
int m = (l+r)>>;
if(L<=m)update(Lson,L,R);
if(R>m)update(Rson,L,R);
pushup(rt);
} int query(int rt,int l,int r,int L,int R)
{
if(L<=l&&R>=r) return tree[rt].cnt;
int m =(l+r)>>;
pushdown(rt);
int ans=;
if(L<=m) ans+=query(Lson,L,R);
if(R>m) ans+=query(Rson,L,R);
return ans;
} int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int T,N,M,u,v,tmp;
while(scanf("%d%d",&N,&M)==){
for(int i=;i<=N;++i) scanf("%d",&b[i]);
build(,,N);
char op[];
int L,R;
while(M--){
scanf("%s %d %d",op,&L,&R);
if(op[]=='a') update(,,N,L,R);
else printf("%d\n",query(,,N,L,R));
}
}
return ;
}

HDU - 6315 Naive Operations (线段树+思维) 2018 Multi-University Training Contest 2的更多相关文章

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

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

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

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

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

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

  4. HDU 6315 Naive Operations(线段树+复杂度均摊)

    发现每次区间加只能加1,最多全局加\(n\)次,这样的话,最后的答案是调和级数为\(nlogn\),我们每当答案加1的时候就单点加,最多加\(nlogn\)次,复杂度可以得当保证. 然后问题就是怎么判 ...

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

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

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

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

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

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

  9. hdu Naive Operations 线段树

    题目大意 题目链接Naive Operations 题目大意: 区间加1(在a数组中) 区间求ai/bi的和 ai初值全部为0,bi给出,且为n的排列,多组数据(<=5),n,q<=1e5 ...

随机推荐

  1. ECLIPSE 不能连接MYSQL 8 的现象

    连接mysql 出现:java.sql.SQLException: Unable to load authentication plugin 'caching_sha2_password'. mysq ...

  2. 项目文件不完整。缺少预期导入,DotnetCore如何切换SDK版本

    1. 项目文件不完整.缺少预期导入 如图: 2. 出现原因: SDK版本与项目所需的SDK版本不一致. 3. 解决问题: 3.1 项目所需的SDK版本如何确定? a. 检查.sln文件所在目录是否有: ...

  3. jQuery特效:图片的轮播

    Flexslider图片轮播.文字图片相结合滑动切换效果 地址:http://www.helloweba.com/view-blog-265.html 示例:http://www.helloweba. ...

  4. 细节取胜的javadoc

    今个以为开发经验丰富的同事提出有个改动有问题,希望改一下.老前辈发话,心虚的紧,立即看了下,问题说是我的方法凝视中写了一个 ** doesn't ** 建议改为 does not 说这个生成javad ...

  5. 在系统重装后为什么ChemDraw用不了

    作为一款非常受欢迎的化学绘图软件ChemDraw需要在满足运行条件的电脑上运行,但是一些用户发现自己在给自己的电脑重装系统之后,ChemDraw运行不了呢.导致ChemDraw用不了的原因比较多样,不 ...

  6. jquery动态生成html代码绑定事件

    今天工作中需要在页面动态生成html代码,但发现新生成的代码的click事件失效了(非动态生成的代码已经绑定了click事件),于是在网上找了很多解决办法,很多都比较复杂,且使用的jquery都比较老 ...

  7. Android新的menu实现——ActionMode

    Android的menu有多种实现方式,以前写过一篇Android中五种常用的menu(菜单),这里介绍一种新的menu实现方式:ActionMode.ActionMode是Android 3.0以后 ...

  8. 【BZOJ4592】[Shoi2015]脑洞治疗仪 线段树

    [BZOJ4592][Shoi2015]脑洞治疗仪 Description 曾经发明了自动刷题机的发明家SHTSC又公开了他的新发明:脑洞治疗仪--一种可以治疗他因为发明而日益增大的脑洞的神秘装置. ...

  9. 【BZOJ4641】基因改造 KMP

    [BZOJ4641]基因改造 Description "人类智慧的冰峰,只有萌萌哒的我寂寞地守望." --TB TB正走在改造人类智慧基因的路上.TB发现人类智慧基因一点也不萌萌哒 ...

  10. iOS section 随tableview一起滚动

    @interface YGSectionHeaderView : UIView @property NSUInteger section; @property (nonatomic, weak) UI ...