看到区间整除操作,直觉是不会除太多次就变成全 \(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. [译]发布ABP v0.19包含Angular UI选项

    发布ABP v0.19包含Angular UI选项 ABP v0.19已发布,包含解决的~90个问题和600+次提交. 新功能 Angular UI 终于,ABP有了一个SPA UI选项,使用最新的A ...

  2. Azure Sphere Development Environment Setup

    1. Visual Studio 目前,Visual Studio 2017/2019支持Azure Sphere开发,后续,微软会加入Visual Studio Code的支持.以Visual St ...

  3. swoole client有什么用

    PHP常用socket创建TCP连接,使用CURL创建HTTP连接,为了简化操作,Swoole提供了Client类用于实现客户端功能,并增加了异步非阻塞模式,让用户在客户端也能使用事件循环. 作为客户 ...

  4. Android Studio 提高开发效率的插件

    好久没有更新博客了,最近搞个listview搞得半死不活的,心累~~ 今天带来的是Android Studio插件的整理,全是我已经安装使用的,写这篇博文的目的也是因为我怕我自己给忘记怎么用(尴尬) ...

  5. go-变量

    变量使用注意事项 变量三种声明方式 var i int //使用默认值 var num = 10.2 //类型推导 num := "tom" //左侧不能同名 //多变量声明 nu ...

  6. GO基础之变量的使用

    Go语言:是静态类型语言,因此变量(variable)是有明确类型的,编译器也会检查变量类型的正确性. 一.基本类型 变量的声明:全局变量必须有关键字var var name [type]  指定数据 ...

  7. Linux命令大全|linux常用命令

    系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS ...

  8. 论文学习-混沌系统以及机器学习模型-11-29-wlg

    混沌系统以及机器学习模型 概述: 必要条件下: negative values of the sub-Lyapunov exponents. 通过rc方法, 可以在参数不匹配的情况下,实现输入信号,混 ...

  9. [20190823]关于CPU成本计算2.txt

    [20190823]关于CPU成本计算2.txt --//前几天探究CPU cost时遇到的问题,获取行成本时我的测试查询结果出现跳跃,不知道为什么,感觉有点奇怪,分析看看.--//ITPUB原始链接 ...

  10. Python—路由追踪(并生成追踪图片)

    需要先安装两个包 [root@localhost ~]# yum install graphviz // 为了使用dot命令 [root@localhost ~]# yum install Image ...