题目链接:

https://loj.ac/p/6029

题意:

思路:

势能时间分析:

每次除数至少为2,所以一个数最多除log次,log次操作后一个区间就会相等,加法又需要log次使区间相等,所以使n个区间相等的复杂度是

区间除操作转化为区间减操作,当区间内最大值除完后与最小值除完后减小量相等,中间的数除完减小量也相等,相当于整个区间减少一样的值。

直接整数除不等于负数向下取整,要用floor((double)x/y)函数。

代码:

#include <bits/stdc++.h>using namespace std;typedef long long ll;
const int N=1e5+10;
typedef struct Node{int l,r;ll sum,ma,mi;ll lz;
}Node;
Node tr[N*4];
ll a[N];
int n,m;
void pushup(int u){tr[u].sum=tr[u<<1].sum+tr[u<<1|1].sum;tr[u].ma=max(tr[u<<1].ma,tr[u<<1|1].ma);tr[u].mi=min(tr[u<<1].mi,tr[u<<1|1].mi);
}
void build(int u,int l,int r){tr[u].l=l,tr[u].r=r;tr[u].lz=0;if(l==r){tr[u].sum=tr[u].ma=tr[u].mi=a[l];return ;}int mid=(l+r)>>1;build(u<<1,l,mid);build(u<<1|1,mid+1,r);pushup(u);
}
void tag_union(int fa,int u){ll len=tr[u].r-tr[u].l+1;ll k=tr[fa].lz;tr[u].sum+=k*len;tr[u].ma+=k;tr[u].mi+=k;tr[u].lz+=k;
}
void pushdown(int u){if(tr[u].lz!=0){tag_union(u,u<<1);tag_union(u,u<<1|1);tr[u].lz=0;}
}void div(int u,int l,int r,ll k){if(tr[u].l>=l&&tr[u].r<=r&&(tr[u].ma-floor((double)tr[u].ma/k))==(tr[u].mi-floor((double)tr[u].mi/k))){ll D=tr[u].ma-floor((double)tr[u].ma/k),len=tr[u].r-tr[u].l+1;tr[u].sum-=D*len;tr[u].lz-=D;tr[u].ma-=D;tr[u].mi-=D;return ;}pushdown(u);int mid=(tr[u].l+tr[u].r)>>1;if(l<=mid)div(u<<1,l,r,k);if(r>mid)div(u<<1|1,l,r,k);pushup(u);
}
void add(int u,int l,int r,ll k){if(tr[u].l>=l&&tr[u].r<=r){ll len=tr[u].r-tr[u].l+1;tr[u].sum+=k*len;tr[u].lz+=k;tr[u].ma+=k;tr[u].mi+=k;return ;}pushdown(u);int mid=(tr[u].l+tr[u].r)>>1;if(l<=mid)add(u<<1,l,r,k);if(r>mid)add(u<<1|1,l,r,k);pushup(u);
}
ll query_mi(int u,int l,int r){if(tr[u].l>=l&&tr[u].r<=r){return tr[u].mi;}ll res; bool ffg=true;pushdown(u);int mid=(tr[u].l+tr[u].r)>>1;if(l<=mid){res=query_mi(u<<1,l,r);ffg=false;}if(r>mid){if(ffg)res=query_mi(u<<1|1,l,r);elseres=min(res,query_mi(u<<1|1,l,r));}return res;
}
ll query_sum(int u,int l,int r){if(tr[u].l>=l&&tr[u].r<=r){return tr[u].sum;}ll res=0;pushdown(u);int mid=(tr[u].l+tr[u].r)>>1;if(l<=mid){res+=query_sum(u<<1,l,r);}if(r>mid){res+=query_sum(u<<1|1,l,r);}return res;
}
int main(){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf("%lld",&a[i]);build(1,1,n);int op,l,r;ll k;while(m--){scanf("%d",&op);if(op==1){scanf("%d%d%lld",&l,&r,&k);l++,r++;add(1,l,r,k);}else if(op==2){scanf("%d%d%lld",&l,&r,&k);l++,r++;div(1,l,r,k);}else if(op==3){scanf("%d%d",&l,&r);l++,r++;printf("%lld\n",query_mi(1,l,r));}else{scanf("%d%d",&l,&r);l++,r++;printf("%lld\n",query_sum(1,l,r));}}
}

「雅礼集训」市场--势能线段树相关推荐

  1. 数据结构二之线段树Ⅱ——KiKi‘s K-Number,ball,The Child and Sequence,「雅礼集训 2017 Day1」市场,Atlantis

    值域线段树+势能线段树+扫描线 KiKi's K-Number ball The Child and Sequence 「雅礼集训 2017 Day1」市场 Atlantis KiKi's K-Num ...

  2. #6029. 「雅礼集训 2017 Day1」市场(势能,区间除)

    #6029. 「雅礼集训 2017 Day1」市场 用线段树维护数列,区间上维护最大最小值,区间和还有标记,修改时,区间加直接做,而区间除时,递归到线段树上某一区间,如果这一操作等价于区间加(也就是最 ...

  3. #6034. 「雅礼集训 2017 Day2」线段游戏 李超树

    #6034. 「雅礼集训 2017 Day2」线段游戏 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统 ...

  4. [LOJ 6042]「雅礼集训 2017 Day7」跳蚤王国的宰相(树的重心+贪心)

    [LOJ 6042]「雅礼集训 2017 Day7」跳蚤王国的宰相 description solution 一个到所有节点距离和最小的节点 ⇔\Leftrightarrow⇔ 树的重心(满足最重的儿 ...

  5. loj #6046. 「雅礼集训 2017 Day8」爷

    #6046. 「雅礼集训 2017 Day8」爷 题目描述 如果你对山口丁和 G&P 没有兴趣,可以无视题目背景,因为你估计看不懂 -- 在第 63 回战车道全国高中生大赛中,军神西住美穗带领 ...

  6. LibreOJ 6514. 「雅礼集训 2018 Day10」文明【虚树+LCA】

    6514. 「雅礼集训 2018 Day10」文明 [题目描述] 传送门 [题解] 考虑笨蛋的写法,可以用LCA求出1号和其他点的中点,然后DFS搜索Size大小即可,但是,复杂度显然要炸,但是我们会 ...

  7. Loj #6503. 「雅礼集训 2018 Day4」Magic

    Loj #6503. 「雅礼集训 2018 Day4」Magic 题目描述 前进!前进!不择手段地前进!--托马斯 · 维德 魔法纪元元年. 1453 年 5 月 3 日 16 时,高维碎片接触地球. ...

  8. 【loj6029】「雅礼集训 2017 Day1」市场 线段树+均摊分析

    题目描述 给出一个长度为 $n$ 的序列,支持 $m$ 次操作,操作有四种:区间加.区间下取整除.区间求最小值.区间求和. $n\le 100000$ ,每次加的数在 $[-10^4,10^4]$ 之 ...

  9. ZCUM-1948: #6029. 「雅礼集训 2017 Day1」市场 线段树区间更新

    题目连接:点击打开链接 从前有一个贸易市场,在一位执政官到来之前都是非常繁荣的,自从他来了之后,发布了一系列奇怪的政令,导致贸易市场的衰落. 有 n nn 个商贩,从 0∼n−1 0 \sim n - ...

最新文章

  1. WAIC | Annotator 5.0标注平台盛大发布暨AI数据生态联盟成立
  2. 简洁好用的KDTree模板
  3. PYTHON——多线程:队列Queue数据结构
  4. Java 10 实战第 1 篇:局部变量类型推断
  5. pageSet的底层数据库存储逻辑
  6. 【TensorRT】将 PyTorch 转化为可部署的 TensorRT
  7. 算法 笔试的时候 如何输入元素?
  8. [振动力学]期中复习
  9. python实现数据恢复_数据恢复/电子取证 非常有用的python库——Construct | 学步园...
  10. Fragment的生命周期同一Activity下不同Fragment之间的通信
  11. jQuery学习笔记02
  12. 404 not found是什么意思
  13. 基于文件夹目录生成CHM电子书
  14. 网站打开速度优化-前端篇
  15. “土地信息+”能否激发千亿大数据应用市场
  16. java多线程并发之旅-34-性能与可伸缩性
  17. php表单数据类型,form表单中enctype属性的三种类型
  18. 小白兔写话_可爱的小白兔二年级写话
  19. $http与ajax的同步请求
  20. 2022-2028全球自动超声波仪器清洗器行业调研及趋势分析报告

热门文章

  1. ECCV2020 Piou Loss论文翻译
  2. 你知道平面设计岗位职责和内容都有哪些吗?
  3. 树莓派玩linux安装qq,树莓派怎么安装QQ
  4. 计算机桌面输入法没有了怎么办,输入法不见了怎么办,小编教你电脑输入法不见了怎么办...
  5. 2019中山纪念中学夏令营-Day14 图论初步【dijkstra算法求最短路】
  6. 用 html标签实现 word 的下标效果
  7. 熊猫烧香制造者出狱后开软件公司
  8. 商业地图 | 从肯德基地理分布浅析商业选址
  9. 福建区块链数字经济发展专项资金申报启动,最高可获300万 | 产业区块链发展周报...
  10. Python 实现快排