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 回战车道全国高中生大赛中,军神西住美穗带领 ...
随机推荐
- 详解 Redis 应用场景及原理
本文转自https://blog.csdn.net/niucsd/article/details/50966733,描述了redis实现原理和应用场景,篇幅较长,有意学习redis的同学可耐心阅读. ...
- bzoj1812 [IOI2005]riv河流
题目链接 problem 给出一棵树,每个点有点权,每条边有边权.0号点为根,每个点的代价是这个点的点权\(\times\)该点到根路径上的边权和. 现在可以选择最多K个点.使得每个点的代价变为:这个 ...
- springboot mail整合freemark实现动态生成模板
目标:1:springboot 整合 mail2: mail 使用freemark 实现模板动态生成(就是通过字符串生成模板,不需要在工程中写入固定模板)3: springboot 整合aop 实现日 ...
- 打印从1到最大的n
题目:输入数字n,按顺序打印出从1到最大的n位十进制数.比如输入3,则打印出1.2.3一直到最大的3位数999 需考虑大数问题 #-*-coding:utf-8-*- class print_N: d ...
- 实现简易JDBC框架
1 准备 JDBC 基本知识 JDBC元数据知识 反射基本知识 2: 两个问题 业务背景:系统中所有实体对象都涉及到基本的CRUD操作.所有实体的CUD操作代码基本相同,仅仅是发送给数据库的sql语 ...
- Python超详细的字符串用法大全
字符串拼接 实际场景:把列表中的数据拼接成一个字符串 解决方案:使用 str.join() 方法 >>> li = ['cxk', 'cxk', 'kk', 'caibi'] > ...
- springMVC校验器(validator)
springmvc使用的是Hibernate Validator(和Hibernate的ORM无关)来完成校验功能 一.普通校验 1.导入jar包 2.编写校验错误配置文件 3.配置校验错误信息文件 ...
- Http协议(自己的一些小小的总结,方便日后学习揣摩)
从2019年6月中旬开始学习JAVA已经差不多6个月了,也算是差不多半只脚踏进了JAVA的大门,没有老师带,遇到问题就要自己查百度,搜博客,去给各个大佬私信留言,也不知道看不看的见. 看了很多大佬的视 ...
- 虚拟机Centos6.7安装VMTools
安装VMware Tools,设置共享文件夹 一.基本步骤 1.VMware Workstation菜单栏中,选择“虚拟机”,”安装VMware Tools...“.(注:此时下方可能会弹出“确保您已 ...
- 【转载】Gradle for Android 第五篇( 多模块构建 )
Android studio不仅允许你为你的app和依赖库创建模块,同时也可为Android wear,Android TV,Google App Engine等创建模块,而这些单独的模块又可以在一个 ...