传送门:https://loj.ac/problem/6029

【题解】

考虑如果有一些近似连续的段

比如 2 2 2 3 3 3,考虑在除3意义下,变成0 0 0 1 1 1,相当于整体-2

又:区间增加很容易造成这种段,所以我们猜测可以暴力维护

用一棵线段树即可。(好像真的能暴力维护啊 我不知道怎么证明复杂度)

# include <stdio.h>
# include <string.h>
# include <iostream>
# include <algorithm>
// # include <bits/stdc++.h> using namespace std; typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const int M = 4e5 + ;
const int mod = 1e9+; # define RG register
# define ST static int n, a[M];
struct SMT {
ll mx[M], mi[M], s[M], tag[M];
# define ls (x<<)
# define rs (x<<|)
inline void up(int x) {
s[x] = s[ls] + s[rs];
mx[x] = max(mx[ls], mx[rs]);
mi[x] = min(mi[ls], mi[rs]);
}
inline void pushtag(int x, ll tg, int len) {
mx[x] += tg;
mi[x] += tg;
s[x] += tg*len;
tag[x] += tg;
}
inline void down(int x, int l, int r) {
if(tag[x] == ) return ;
int mid = l+r>>;
pushtag(ls, tag[x], mid-l+);
pushtag(rs, tag[x], r-mid);
tag[x] = ;
}
inline void build(int x, int l, int r) {
tag[x] = ;
if(l == r) {
mx[x] = mi[x] = s[x] = a[l];
return ;
}
int mid = l+r>>;
build(ls, l, mid);
build(rs, mid+, r);
up(x);
}
inline void edt(int x, int l, int r, int L, int R, int c) {
if(L <= l && r <= R) {
pushtag(x, c, r-l+);
return ;
}
down(x, l, r);
int mid = l+r>>;
if(L <= mid) edt(ls, l, mid, L, R, c);
if(R > mid) edt(rs, mid+, r, L, R, c);
up(x);
}
inline void div(int x, int l, int r, int L, int R, int d) {
if(L <= l && r <= R) {
ll A, B;
if(mi[x] < ) A = (mi[x] - d + ) / d;
else A = mi[x] / d;
if(mx[x] < ) B = (mx[x] - d + ) / d;
else B = mx[x] / d;
if(mi[x] - A == mx[x] - B) {
pushtag(x, A - mi[x], r-l+);
return ;
}
}
down(x, l, r);
int mid = l+r>>;
if(L <= mid) div(ls, l, mid, L, R, d);
if(R > mid) div(rs, mid+, r, L, R, d);
up(x);
}
inline ll sum(int x, int l, int r, int L, int R) {
if(L <= l && r <= R) return s[x];
down(x, l, r);
int mid = l+r>>;
ll ret = ;
if(L <= mid) ret += sum(ls, l, mid, L, R);
if(R > mid) ret += sum(rs, mid+, r, L, R);
return ret;
}
inline ll gmin(int x, int l, int r, int L, int R) {
if(L <= l && r <= R) return mi[x];
down(x, l, r);
int mid = l+r>>;
ll ret = 1e18;
if(L <= mid) ret = min(ret, gmin(ls, l, mid, L, R));
if(R > mid) ret = min(ret, gmin(rs, mid+, r, L, R));
return ret;
}
}T; int main() {
int Q, opt, l, r, x;
cin >> n >> Q;
for (int i=; i<=n; ++i) scanf("%d", a+i);
T.build(, , n);
while(Q--) {
scanf("%d%d%d", &opt, &l, &r); ++l, ++r;
if(opt == ) {
scanf("%d", &x);
T.edt(, , n, l, r, x);
} else if(opt == ) {
scanf("%d", &x);
T.div(, , n, l, r, x);
} else if(opt == ) printf("%lld\n", T.gmin(, , n, l, r));
else printf("%lld\n", T.sum(, , n, l, r));
}
return ;
}

loj6029 「雅礼集训 2017 Day1」市场的更多相关文章

  1. LOJ6029「雅礼集训 2017 Day1」市场 (线段树)

    题面 从前有一个学校,在 O n e I n D a r k \rm OneInDark OneInDark 到任之前风气都是非常良好的,自从他来了之后,发布了一系列奇怪的要求,挟制了整个学校,导致风 ...

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

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

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

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

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

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

  5. 【LOJ6029】「雅礼集训 2017 Day1」市场(线段树裸题)

    点此看题面 大致题意: 维护序列,支持区间加法,区间除法(向下取整),区间求\(min\)和区间求和. 线段树维护区间除法 区间加法.区间求\(min\)和区间求和都是线段树基本操作,因此略过不提. ...

  6. 【loj6029】「雅礼集训 2017 Day1」市场

    题目 题意:四种操作,区间加法.区间除法(下取整).区间求最小值.区间求和. 第1.3.4个操作都是摆设,关键在于如何做区间除法. 很明显不能直接把区间的和做除法后向下取整,因为区间和可能会多凑出一个 ...

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

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

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

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

  9. #6029. 「雅礼集训 2017 Day1」市场 [线段树]

    考虑到每次除法,然后加法,差距会变小,于是维护加法lazytag即可 #include <cstdio> #include <cmath> #define int long l ...

随机推荐

  1. Hibernate-ORM:04.Hibernate中的get()和load()

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客会讲如何用get()或load()查询单个对象和对缓存的简单操作,以及他俩的区别和相同(前面有的那些配 ...

  2. 获得通讯录并拨打电话 Android

    由于通讯录在手机里是以数据库贮存的 所以我们可以通过getContentResolver来获得通讯录 ,这个方法返回一个游标的数据类型,通过moveToNext()方法来获取所有的手机号码信息, 当然 ...

  3. Django打造大型企业官网

    第1章 Django预热 1-为什么需要虚拟环境 2-virtualenv创建虚拟环境 3-virtualenvwrapper使用 4-URL组成部分讲解 5-课程准备工作 6-Django介绍 第2 ...

  4. 阿里云ECS下基于Centos7.4安装MySQL5.7.20

     1.首先登录阿里云ECS服务器,如下图所示: 2.卸载MariaDB 说明:CentOS7.x默认安装MariaDB而不是MySQL,而且yum服务器上也移除了MySQL相关的软件包.因为Maria ...

  5. 不得不服!Python速度虽然慢,但是它工作效率很高!

    写在前面 让我们来讨论一个我最近一直在思考的问题:Python 的性能.顺便说一下,我是 Python 的忠实拥趸,我在各种情况下都会积极尝试使用 Python 来解决问题.大家对 Python 最大 ...

  6. Spark搭档Elasticsearch

    Spark与elasticsearch结合使用是一种常用的场景,小编在这里整理了一些Spark与ES结合使用的方法.一. write data to elasticsearch利用elasticsea ...

  7. Mac下安装OpenCV问题

    最近看了纹理特征方面的paper,看了一些资料之后,想要实际动手实现一下其中LBP算法,果然OpenCV中已经实现. 问题 No module named "cv2" 当我在我们项 ...

  8. lintcode-108-分割回文串 II

    108-分割回文串 II 给定一个字符串s,将s分割成一些子串,使每个子串都是回文. 返回s符合要求的的最少分割次数. 样例 比如,给出字符串s = "aab", 返回 1, 因为 ...

  9. 关于word文档中目录的switch

    有很多的switch,下面这篇文章介绍的比较详细,可以参考:http://word.mvps.org/FAQs/Formatting/TOCSwitches.htm

  10. React & shit Antd

    React & shit Antd https://ant.design/components/tooltip-cn/ https://ant.design/components/tag-cn ...