LOJ6029 [雅礼集训2017]市场
看到区间整除操作,直觉是不会除太多次就变成全 \(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]市场的更多相关文章
- [LOJ 6029]「雅礼集训 2017 Day1」市场
[LOJ 6029] 「雅礼集训 2017 Day1」市场 题意 给定一个长度为 \(n\) 的数列(从 \(0\) 开始标号), 要求执行 \(q\) 次操作, 每次操作为如下四种操作之一: 1 l ...
- 「雅礼集训 2017 Day1」 解题报告
「雅礼集训 2017 Day1」市场 挺神仙的一题.涉及区间加.区间除.区间最小值和区间和.虽然标算就是暴力,但是复杂度是有保证的. 我们知道如果线段树上的一个结点,\(max=min\) 或者 \( ...
- LOJ_6045_「雅礼集训 2017 Day8」价 _最小割
LOJ_6045_「雅礼集训 2017 Day8」价 _最小割 描述: 有$n$种减肥药,$n$种药材,每种减肥药有一些对应的药材和一个收益. 假设选择吃下$K$种减肥药,那么需要这$K$种减肥药包含 ...
- 「雅礼集训 2017 Day7」事情的相似度
「雅礼集训 2017 Day7」事情的相似度 题目链接 我们先将字符串建后缀自动机.然后对于两个前缀\([1,i]\),\([1,j]\),他们的最长公共后缀长度就是他们在\(fail\)树上对应节点 ...
- 「雅礼集训 2017 Day2」解题报告
「雅礼集训 2017 Day2」水箱 我怎么知道这种题目都能构造树形结构. 根据高度构造一棵树,在树上倍增找到最大的小于约束条件高度的隔板,开一个 \(vector\) 记录一下,然后对于每个 \(v ...
- [LOJ 6031]「雅礼集训 2017 Day1」字符串
[LOJ 6031] 「雅礼集训 2017 Day1」字符串 题意 给定一个长度为 \(n\) 的字符串 \(s\), \(m\) 对 \((l_i,r_i)\), 回答 \(q\) 个询问. 每个询 ...
- [LOJ 6030]「雅礼集训 2017 Day1」矩阵
[LOJ 6030] 「雅礼集训 2017 Day1」矩阵 题意 给定一个 \(n\times n\) 的 01 矩阵, 每次操作可以将一行转置后赋值给某一列, 问最少几次操作能让矩阵全为 1. 无解 ...
- 【LYOI 212】「雅礼集训 2017 Day8」价(二分匹配+最大权闭合子图)
「雅礼集训 2017 Day8」价 内存限制: 512 MiB时间限制: 1000 ms 输入文件: z.in输出文件: z.out [分析] 蛤?一开始看错题了,但是也没有改,因为不会做. 一开 ...
- loj #6046. 「雅礼集训 2017 Day8」爷
#6046. 「雅礼集训 2017 Day8」爷 题目描述 如果你对山口丁和 G&P 没有兴趣,可以无视题目背景,因为你估计看不懂 …… 在第 63 回战车道全国高中生大赛中,军神西住美穗带领 ...
随机推荐
- Paper | Deep Mutual Learning
目录 1. 动机详述和方法简介 2. 相关工作 3. 方法 3.1 Formulation 3.2 实现 3.3 弱监督学习 4. 实验 4.1 基本实验 4.2 深入实验 [算法和公式很simple ...
- vim 下修改tab键为四个空格
最近在运行python的时候,发现tab键在在运行过程中无法使用,报错:IndentationError: unindent does not match any outer indentation ...
- 19-视图集ViewSet和路由Routers
一.视图集ViewSet 使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中: 1.list()提供一组数据 2.retrieve()提供单个数据 3.create()创建数据 4.up ...
- redis设置、查看和校验密码
Redis没有实现访问控制这个功能,但是它提供了一个轻量级的认证方式(密码),可以通过编辑[redis.conf]配置文件来启用认证,这里简单介绍一下Redis中如何设置.查看和校验密码(登录验证和操 ...
- 黄聪:不使用 webpack,vuejs 异步加载模板
webpack 打包不会玩,整了这么个小玩具 一段 vue 绑定代码,关键点在 gmallComponent 1.异步加载外部 vue 文件(非 .vue) 2.按一定规则拆分 template.sc ...
- 用redis-dump工具对redis集群所有数据进行导出导入
安装redis-dump redis-dump是基于ruby开发,需要ruby环境,而且新版本的redis-dump要求2.2.2以上的ruby版本,centos中yum只能安装2.0版本的ruby. ...
- vue拖拽组件开发
vue拖拽组件开发 创建临时vue项目 先查看node和npm版本,怎么安装就不多多bb了 再安装vue-cli npm install vue-cli -g //全局安装 vue-cli 检测是否安 ...
- Android Studio 提高开发效率的插件
好久没有更新博客了,最近搞个listview搞得半死不活的,心累~~ 今天带来的是Android Studio插件的整理,全是我已经安装使用的,写这篇博文的目的也是因为我怕我自己给忘记怎么用(尴尬) ...
- 在.net core程序中使用EntityFrameok(非EF Core)
最近用NoSQL较多写,用传统的EF到不多,但在一些.net core小程序中也小试牛刀过,不过当时用的是微软为.net core量身定制的Entity Framework Core,只是一些比较常规 ...
- 动软生成Model(dapper.common)
<#@ template language="c#" HostSpecific="True" #><#@ output extension= ...