link

试题分析

可以容易发现此题维护的是一个数据结构,支持区间加,区间除,区间查询最大值。其实就是在$\log$级复杂度内维护除法操作。

我们发现当除数很大或者此串序列大小差不多时,我们令$a_i$为原来,$b_i$为现在,则对于$[l,r]$中的任意一个数$i$,则出现$a_i-b_i$为恒值。则我们可以用线段树去维护即可。

举个例子:

当我们要在$1,2,3,4,5$中每一个数除以$1$时,我们可以发现每个数都$a_i-b_i=0$,所以做区间减法即可

当我们要在$2,3,3,3,3$中每一个数除以$2$时,$a_i-b_i=2$.所以此段区间每个数减$2$即可。

那我们则么快速寻找是否会一样,我们只要看一下当前序列最大值与最小值的变化即可,因为他们是具有代表性的。

然后就只要维护一个区间修改,最大值,最小值,区间查询的线段树即可。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<climits>
#define int long long
using namespace std;
inline int read()
{
int f=,ans=;char c;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){ans=ans*+c-'';c=getchar();}
return ans*f;
}
const int N=;
int n,q;
int val[N],maxn[N<<],minn[N<<],sum[N<<],tag[N<<];
void pushup(int k){
maxn[k]=max(maxn[k<<],maxn[k<<|]);
minn[k]=min(minn[k<<],minn[k<<|]);
sum[k]=sum[k<<]+sum[k<<|];
}
void build(int k,int l,int r){
if(l==r){maxn[k]=minn[k]=sum[k]=val[l];return;}
int mid=l+r>>;
build(k<<,l,mid),build(k<<|,mid+,r);
pushup(k);
return;
}
void pushdown(int k,int l,int r){
if(tag[k]==) return;
int mid=l+r>>;
sum[k<<]+=(mid-l+)*tag[k],sum[k<<|]+=(r-mid)*tag[k];
maxn[k<<]+=tag[k],minn[k<<]+=tag[k];
maxn[k<<|]+=tag[k],minn[k<<|]+=tag[k];
tag[k<<]+=tag[k],tag[k<<|]+=tag[k];
tag[k]=;
return;
}
void add(int k,int l,int r,int x,int y,int w){
// cout<<"l:"<<l<<" r:"<<r<<" w:"<<w<<endl;
if(x<=l&&r<=y){
maxn[k]+=w,minn[k]+=w,tag[k]+=w;sum[k]+=(r-l+)*w;
return;
}
pushdown(k,l,r);
int mid=l+r>>;
if(x<=mid) add(k<<,l,mid,x,y,w);
if(mid<y) add(k<<|,mid+,r,x,y,w);
pushup(k);
return;
}
void div(int k,int l,int r,int x,int y,int w){
if(x<=l&&r<=y){
int s1=maxn[k]-(int)floor((double)maxn[k]/(double)w),s2=minn[k]-(int)floor((double)minn[k]/(double)w);
if(s1==s2){
tag[k]-=s1;sum[k]-=(r-l+)*s1;maxn[k]-=s1,minn[k]-=s1;
return;
}
}
pushdown(k,l,r);
int mid=l+r>>;
if(x<=mid) div(k<<,l,mid,x,y,w);
if(mid<y) div(k<<|,mid+,r,x,y,w);
pushup(k);
return;
}
int query_minn(int k,int l,int r,int x,int y){
if(x<=l&&r<=y) return minn[k];
int res=LLONG_MAX,mid=l+r>>;
pushdown(k,l,r);
if(x<=mid) res=min(res,query_minn(k<<,l,mid,x,y));
if(mid<y) res=min(res,query_minn(k<<|,mid+,r,x,y));
pushup(k);
return res;
}
int query_sum(int k,int l,int r,int x,int y){
if(x<=l&&r<=y) return sum[k];
pushdown(k,l,r);
int res=,mid=l+r>>;
if(x<=mid) res+=query_sum(k<<,l,mid,x,y);
if(mid<y) res+=query_sum(k<<|,mid+,r,x,y);
pushup(k);
return res;
}
void find1(int k,int l,int r){
if(l==r){cout<<maxn[k]<<" ";return;}
int mid=l+r>>;
pushdown(k,l,r);
find1(k<<,l,mid),find1(k<<|,mid+,r);
pushup(k);
return;
}
signed main(){
n=read(),q=read();
for(int i=;i<=n;i++) val[i]=read();
build(,,n);
while(q--){
int opt=read(),l=read()+,r=read()+;
if(opt==) {
int w=read();
add(,,n,l,r,w);
}
if(opt==){
int w=read();
div(,,n,l,r,w);
}
if(opt==) printf("%lld\n",query_minn(,,n,l,r));
if(opt==) printf("%lld\n",query_sum(,,n,l,r));
}
}

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

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

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

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

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

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

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

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

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

  5. loj#6029. 「雅礼集训 2017 Day1」市场(线段树)

    题意 链接 Sol 势能分析. 除法是不能打标记的,所以只能暴力递归.这里我们加一个剪枝:如果区间内最大最小值的改变量都相同的话,就变成区间减. 这样复杂度是\((n + mlogn) logV\)的 ...

  6. 【loj6029】「雅礼集训 2017 Day1」市场&&【uoj#228】基础数据结构练习题

    题解: 这两道题加上区间取min max应该算线段树几道比较不寻常的题目 其实也是挺好理解的 对于区间/d 显然在log次后就会等于0 而我们注意到如果区间中数都相等那么就可以一起除 也就是说每个区间 ...

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

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

  8. 「雅礼集训 2017 Day1」市场 (线段树除法,区间最小,区间查询)

    老师说,你们暴力求除法也整不了多少次就归一了,暴力就好了(应该只有log(n)次) 于是暴力啊暴力,结果我归天了. 好吧,在各种题解的摧残下,我终于出了一篇巨好看(chou lou)代码(很多结构体党 ...

  9. loj6029 「雅礼集训 2017 Day1」市场

    传送门:https://loj.ac/problem/6029 [题解] 考虑如果有一些近似连续的段 比如 2 2 2 3 3 3,考虑在除3意义下,变成0 0 0 1 1 1,相当于整体-2 又:区 ...

随机推荐

  1. 002 -- MySQL的逻辑架构

                                            msql的逻辑架构图 第一层:主要功能是连接处理.授权认证.安全等.相当于JavaEE中的常说的Web层 第二层:包含了 ...

  2. 3星|李开复《AI·未来》:中国创业公司有独特优势,人工智能可能会加剧社会的不平等与不稳定

    主要内容:作者对自己一些经历的回顾,对中美两国人工智能行业的回顾与展望. 作者认为中国的创业公司比美国节奏更快工作更拼命,深圳在硬件创新上远远领先于美国,中国创业公司们走出了一条跟美国不同的路. 作者 ...

  3. 3.10-通过requests、BeautifulSoup、webbrowser模块的相关方法,爬取网页数据示例程序(一)

    import requests,bs4res=requests.get('https://www.hao123.com/')print('res对象的类型:',type(res))res.raise_ ...

  4. 如何使用openstack OCL

    本节首先讨论 image 删除操作,然后介绍 OpenStack CLI 的使用方法,最后讨如何 Troubleshoot. Web UI 删除 image admin 登录后,Project -&g ...

  5. Qt中容器类应该如何存储对象

    Qt提供了丰富的容器类型,如:QList.QVector.QMap等等.详细的使用方法可以参考官方文档,网上也有很多示例文章,不过大部分文章的举例都是使用基础类型:如int.QString等.如果我们 ...

  6. PHP中的数据类型

    PHP中包含8种数据类型,其中包括4种标量:整型,浮点型,字符串,布尔值:2种复合类型:数组和对象:一种resource类型,剩下的一种是NULL类型. 整型 PHP中的整型可以是负,也可以是正,而整 ...

  7. “Hello World!”团队第七周召开的第一次会议

    今天是我们团队“Hello World!”团队第七周召开的第一次会议.博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.Todo List 六.会议照片 七.燃尽图 一.会议时间 ...

  8. Beta阶段第一次网络会议

    Beta阶段第一次网络会议 游戏问题 游戏细节特征不够明显,大小虽然随着电脑分辨率的不同变化着,但是存在清楚的问题 游戏中的提示信息不够,玩家无法快速了解游戏 游戏中背景声音过于单一 游戏AI太简单 ...

  9. android入门 — 多线程(一)

    android中的一些耗时操作,例如网络请求,如果不能及时响应,就会导致主线程被阻塞,出现ANR,非常影响用户体验,所以一些耗时的操作,我们会想办法放在子线程中去完成. android的UI操作并不是 ...

  10. TCP系列45—拥塞控制—8、SACK关闭的拥塞撤销与虚假快速重传

    一.概述 这篇文章介绍一下TCP从Recovery状态恢复到Open状态的时候cwnd的更新.我们在tcp重传部分的文章中曾经介绍过虚假重传的概念,Linux在探测到虚假重传的时候就会执行拥塞撤销操作 ...