看到区间整除操作,直觉是不会除太多次就变成全 \(1\)。

然而现在还有加操作。

我也不知道为什么,当一个节点的 \(\lfloor\frac{mx}{d}\rfloor=\lfloor\frac{mn}{d}\rfloor\) 的时候变成区间赋值,否则继续递归复杂度是错的,但是 \(\lfloor\frac{mx}{d}\rfloor-mx=\lfloor\frac{mn}{d}\rfloor-mn\) 变成区间加复杂度就对了???

下面两个都用上了。

(求证明复杂度……)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=400040;
#define ls o<<1
#define rs o<<1|1
#define lson ls,l,mid
#define rson rs,mid+1,r
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline int read(){
int x=0,f=0;char ch=getchar();
while(ch<'0' || ch>'9') f|=ch=='-',ch=getchar();
while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
return f?-x:x;
}
int n,q,a[maxn];
ll sum[maxn],add[maxn],cov[maxn],mx[maxn],mn[maxn];
inline void pushup(int o){
sum[o]=sum[ls]+sum[rs];
mx[o]=max(mx[ls],mx[rs]);
mn[o]=min(mn[ls],mn[rs]);
}
inline void setadd(int o,int l,int r,ll v){
sum[o]+=(r-l+1)*v;
mx[o]+=v;
mn[o]+=v;
add[o]+=v;
}
inline void setcov(int o,int l,int r,ll v){
sum[o]=(r-l+1)*v;
mx[o]=mn[o]=cov[o]=v;
add[o]=0;
}
inline void pushdown(int o,int l,int r){
int mid=(l+r)>>1;
if(cov[o]!=1e18){
setcov(lson,cov[o]);
setcov(rson,cov[o]);
cov[o]=1e18;
}
if(add[o]){
setadd(lson,add[o]);
setadd(rson,add[o]);
add[o]=0;
}
}
void build(int o,int l,int r){
cov[o]=1e18;
if(l==r) return void(mx[o]=mn[o]=sum[o]=a[l]);
int mid=(l+r)>>1;
build(lson);build(rson);
pushup(o);
}
void update_add(int o,int l,int r,int ql,int qr,int v){
if(l>=ql && r<=qr) return setadd(o,l,r,v);
int mid=(l+r)>>1;
pushdown(o,l,r);
if(mid>=ql) update_add(lson,ql,qr,v);
if(mid<qr) update_add(rson,ql,qr,v);
pushup(o);
}
inline ll ddiv(ll x,ll y){
if(x>=0) return x/y;
else return -((-x+y-1)/y);
}
void update_div(int o,int l,int r,int ql,int qr,int v){
if(l>=ql && r<=qr){
if(ddiv(mx[o],v)==ddiv(mn[o],v)) return setcov(o,l,r,ddiv(mx[o],v));
if(ddiv(mx[o],v)-mx[o]==ddiv(mn[o],v)-mn[o]) return setadd(o,l,r,ddiv(mx[o],v)-mx[o]);
}
int mid=(l+r)>>1;
pushdown(o,l,r);
if(mid>=ql) update_div(lson,ql,qr,v);
if(mid<qr) update_div(rson,ql,qr,v);
pushup(o);
}
ll query_sum(int o,int l,int r,int ql,int qr){
if(l>=ql && r<=qr) return sum[o];
int mid=(l+r)>>1;
pushdown(o,l,r);
if(mid<ql) return query_sum(rson,ql,qr);
if(mid>=qr) return query_sum(lson,ql,qr);
return query_sum(lson,ql,qr)+query_sum(rson,ql,qr);
}
ll query_min(int o,int l,int r,int ql,int qr){
if(l>=ql && r<=qr) return mn[o];
int mid=(l+r)>>1;
pushdown(o,l,r);
if(mid<ql) return query_min(rson,ql,qr);
if(mid>=qr) return query_min(lson,ql,qr);
return min(query_min(lson,ql,qr),query_min(rson,ql,qr));
}
int main(){
n=read();q=read();
FOR(i,1,n) a[i]=read();
build(1,1,n);
while(q--){
int op=read(),l=read()+1,r=read()+1;
if(op==1) update_add(1,1,n,l,r,read());
if(op==2) update_div(1,1,n,l,r,read());
if(op==3) printf("%lld\n",query_min(1,1,n,l,r));
if(op==4) printf("%lld\n",query_sum(1,1,n,l,r));
}
}

LOJ6029 [雅礼集训2017]市场的更多相关文章

  1. [LOJ 6029]「雅礼集训 2017 Day1」市场

    [LOJ 6029] 「雅礼集训 2017 Day1」市场 题意 给定一个长度为 \(n\) 的数列(从 \(0\) 开始标号), 要求执行 \(q\) 次操作, 每次操作为如下四种操作之一: 1 l ...

  2. 「雅礼集训 2017 Day1」 解题报告

    「雅礼集训 2017 Day1」市场 挺神仙的一题.涉及区间加.区间除.区间最小值和区间和.虽然标算就是暴力,但是复杂度是有保证的. 我们知道如果线段树上的一个结点,\(max=min\) 或者 \( ...

  3. LOJ_6045_「雅礼集训 2017 Day8」价 _最小割

    LOJ_6045_「雅礼集训 2017 Day8」价 _最小割 描述: 有$n$种减肥药,$n$种药材,每种减肥药有一些对应的药材和一个收益. 假设选择吃下$K$种减肥药,那么需要这$K$种减肥药包含 ...

  4. 「雅礼集训 2017 Day7」事情的相似度

    「雅礼集训 2017 Day7」事情的相似度 题目链接 我们先将字符串建后缀自动机.然后对于两个前缀\([1,i]\),\([1,j]\),他们的最长公共后缀长度就是他们在\(fail\)树上对应节点 ...

  5. 「雅礼集训 2017 Day2」解题报告

    「雅礼集训 2017 Day2」水箱 我怎么知道这种题目都能构造树形结构. 根据高度构造一棵树,在树上倍增找到最大的小于约束条件高度的隔板,开一个 \(vector\) 记录一下,然后对于每个 \(v ...

  6. [LOJ 6031]「雅礼集训 2017 Day1」字符串

    [LOJ 6031] 「雅礼集训 2017 Day1」字符串 题意 给定一个长度为 \(n\) 的字符串 \(s\), \(m\) 对 \((l_i,r_i)\), 回答 \(q\) 个询问. 每个询 ...

  7. [LOJ 6030]「雅礼集训 2017 Day1」矩阵

    [LOJ 6030] 「雅礼集训 2017 Day1」矩阵 题意 给定一个 \(n\times n\) 的 01 矩阵, 每次操作可以将一行转置后赋值给某一列, 问最少几次操作能让矩阵全为 1. 无解 ...

  8. 【LYOI 212】「雅礼集训 2017 Day8」价(二分匹配+最大权闭合子图)

    「雅礼集训 2017 Day8」价 内存限制: 512 MiB时间限制: 1000 ms 输入文件: z.in输出文件: z.out   [分析] 蛤?一开始看错题了,但是也没有改,因为不会做. 一开 ...

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

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

随机推荐

  1. 小程序-小菊花loading

    界面----交互 wx.showLoading() 显示loading提示框.需主动调用wx.hideLoading()才能关闭提示框 参数: 属性 类型 默认值 必填 说明 title string ...

  2. js获取计算机操作系统版本

    如题,想要获取当先计算机的操作系统和版本号的话,可以用如下方法. 首先,创建osversion.js文件,文件里面的代码如下 var osData = [ { name: 'Windows 2000' ...

  3. python爬取昵称并保存为csv

    代码: import sys import io import re sys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030') ...

  4. ASP.NET Core框架深度学习(四)宿主对象

    11.WebHost  第六个对象 到目前为止我们已经知道了由一个服务器和多个中间件构成的管道是如何完整针对请求的监听.接收.处理和最终响应的,接下来来讨论这样的管道是如何被构建出来的.管道是在作为应 ...

  5. numpy 和 tensorflow 中的各种乘法(点乘和矩阵乘)

    点乘和矩阵乘的区别: 1)点乘(即" * ") ---- 各个矩阵对应元素做乘法 若 w 为 m*1 的矩阵,x 为 m*n 的矩阵,那么通过点乘结果就会得到一个 m*n 的矩阵. ...

  6. 初识Lock与AbstractQueuedSynchronizer(AQS)

    本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:h ...

  7. git fetch & pull详解

    1.简单概括 先用一张图来理一下git fetch和git pull的概念: 可以简单的概括为: git fetch是将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中. 而g ...

  8. TCP三次握手四次分手—简单详解

    关于TCP三次握手四次分手,之前看资料解释的都很笼统,很多地方都不是很明白,所以很难记,前几天看的一个博客豁然开朗,可惜现在找不到了.现在把之前的疑惑总结起来,方便一下大家. 疑问一,上图传递过程中出 ...

  9. JS实现深浅拷贝

    1.实现浅拷贝 // 1. ...实现 let copy1 = {...{x:1}} // 2. Object.assign实现 let copy2 = Object.assign({}, {x:1} ...

  10. Model赋值返回json

    DataTable resultList = bll.GetResultListByCondition(bureauCode, deptCode, fileTitle); IList<GanBu ...