题目

在长度为\(n(n\leq 10^5)\)的数列中,

需要满足区间加,区间下取整的操作

以及能够查询区间和以及区间最小值

除数\(d\)满足\(2\leq d\leq 10^9\)

加数\(c\)满足\(-10^4\leq c\leq 10^4\)


分析

线段树,除了区间下取整,其它都挺常规的

就说区间下取整,不满足区间可加性,那显然只能从暴力入手

如果一直分治到叶子节点,时间复杂度太高,那么要找条件去提前特判

使得时间复杂度均摊\(O(nlognlog mx)\),

其中由于加数比较小,一般常数比较小

好的,那么怎样特判,那可以转换为区间减那该多好

那希望使得\(a_j-\lfloor\frac{a_j}{d}\rfloor\)相同

只要维护区间最小值和最大值,如果带进去相同,显然这一段可以被转换为区间减

然后就完成了,注意\(C++\)中的除号是向零取整,最好直接用\(\text{cmath::floor}\)


代码

#include <cstdio>
#include <cctype>
#include <cmath>
#define rr register
using namespace std;
const int N = 100011;
typedef long long lll;
int a[N], n, Q, mn[N << 2], lazy[N << 2], mx[N << 2];
lll w[N << 2];
inline signed iut() {
rr int ans = 0, f = 1;
rr char c = getchar();
while (!isdigit(c)) f = (c == '-') ? -f : f, c = getchar();
while (isdigit(c)) ans = (ans << 3) + (ans << 1) + (c ^ 48), c = getchar();
return ans * f;
}
inline void print(lll ans) {
if (ans < 0)
ans = -ans, putchar('-');
if (ans > 9)
print(ans / 10);
putchar(ans % 10 + 48);
}
inline signed min(int a, int b) { return a < b ? a : b; }
inline signed max(int a, int b) { return a > b ? a : b; }
inline void pup(int k) {
w[k] = w[k << 1] + w[k << 1 | 1], mn[k] = min(mn[k << 1], mn[k << 1 | 1]),
mx[k] = max(mx[k << 1], mx[k << 1 | 1]);
}
inline void pdown(int k, int l, int r) {
rr int mid = (l + r) >> 1, t = lazy[k];
lazy[k] = 0;
w[k << 1] += t * (mid - l + 1), w[k << 1 | 1] += t * (r - mid), mn[k << 1] += t, mn[k << 1 | 1] += t,
mx[k << 1] += t, mx[k << 1 | 1] += t, lazy[k << 1] += t, lazy[k << 1 | 1] += t;
}
inline void build(int k, int l, int r) {
if (l == r) {
w[k] = mn[k] = mx[k] = a[l];
return;
}
rr int mid = (l + r) >> 1;
build(k << 1, l, mid);
build(k << 1 | 1, mid + 1, r);
pup(k);
}
inline void update1(int k, int l, int r, int x, int y, int z) {
if (l == x && r == y) {
w[k] += 1ll * (r - l + 1) * z, lazy[k] += z, mn[k] += z, mx[k] += z;
return;
}
if (lazy[k])
pdown(k, l, r);
rr int mid = (l + r) >> 1;
if (y <= mid)
update1(k << 1, l, mid, x, y, z);
else if (x > mid)
update1(k << 1 | 1, mid + 1, r, x, y, z);
else
update1(k << 1, l, mid, x, mid, z), update1(k << 1 | 1, mid + 1, r, mid + 1, y, z);
pup(k);
}
inline void update2(int k, int l, int r, int x, int y, int z) {
if (x <= l && r <= y) {
rr int t1 = floor(1.0 * mn[k] / z);
rr int t2 = floor(1.0 * mx[k] / z);
rr int MN = mn[k] - t1, MX = mx[k] - t2;
if (MN == MX) {
mn[k] -= MN, mx[k] -= MN, lazy[k] -= MN, w[k] -= 1ll * (r - l + 1) * MN;
return;
}
}
if (lazy[k])
pdown(k, l, r);
rr int mid = (l + r) >> 1;
if (x <= mid)
update2(k << 1, l, mid, x, y, z);
if (mid < y)
update2(k << 1 | 1, mid + 1, r, x, y, z);
pup(k);
}
inline lll query1(int k, int l, int r, int x, int y) {
if (l == x && r == y)
return w[k];
if (lazy[k])
pdown(k, l, r);
rr int mid = (l + r) >> 1;
if (y <= mid)
return query1(k << 1, l, mid, x, y);
else if (x > mid)
return query1(k << 1 | 1, mid + 1, r, x, y);
else
return query1(k << 1, l, mid, x, mid) + query1(k << 1 | 1, mid + 1, r, mid + 1, y);
}
inline signed query2(int k, int l, int r, int x, int y) {
if (l == x && r == y)
return mn[k];
if (lazy[k])
pdown(k, l, r);
rr int mid = (l + r) >> 1;
if (y <= mid)
return query2(k << 1, l, mid, x, y);
else if (x > mid)
return query2(k << 1 | 1, mid + 1, r, x, y);
else
return min(query2(k << 1, l, mid, x, mid), query2(k << 1 | 1, mid + 1, r, mid + 1, y));
}
signed main() {
n = iut();
Q = iut();
for (rr int i = 1; i <= n; ++i) a[i] = iut();
build(1, 1, n);
for (rr int i = 1; i <= Q; ++i) {
rr int z = iut(), l = iut() + 1, r = iut() + 1;
switch (z) {
case 1: {
update1(1, 1, n, l, r, iut());
break;
}
case 2: {
update2(1, 1, n, l, r, iut());
break;
}
case 3: {
print(query2(1, 1, n, l, r)), putchar(10);
break;
}
case 4: {
print(query1(1, 1, n, l, r)), putchar(10);
break;
}
}
}
return 0;
}

#线段树#LOJ 6029「雅礼集训 2017 Day1」市场的更多相关文章

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

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

  2. LOJ #6029. 「雅礼集训 2017 Day1」市场 线段树维护区间除法

    题目描述 从前有一个贸易市场,在一位执政官到来之前都是非常繁荣的,自从他来了之后,发布了一系列奇怪的政令,导致贸易市场的衰落. 有 \(n\) 个商贩,从\(0 \sim n - 1\) 编号,每个商 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. ubantu中安装redis及遇到的问题

    安装命令 sudo apt-get install redis-server 开启远程连接 找到vi /etc/redis/redis.conf文件修改如下 bind 127.0.0.1 为 0.0. ...

  2. Golang使用Gin-swagger搭建api文档

    前提是安装好了go环境与vscode环境 并配置过了gin 项目结构 1.先安装swaggo依赖包 //1 go get "github.com/swaggo/files" //2 ...

  3. 06、etcd 写请求执行流程

    本篇内容主要来源于自己学习的视频,如有侵权,请联系删除,谢谢. 上一节我们学习了 etcd 读请求执行流程,这一节,我们来学习 etcd 写请求执行流程. 1.etcd写请求概览 etcd 一个写请求 ...

  4. 扣子(coze.cn)| 由浅入深,手把手带你实现Java转型学习助手

    扣子(coze.cn)是一款用来开发新一代 AI Chat Bot 的应用编辑平台,无论你是否有编程基础,都可以通过这个平台来快速创建各种类型的 Chat Bot,并将其发布到各类社交平台和通讯软件上 ...

  5. Java纯手打web服务器(三)

    概要:考虑到上一篇中的request和response对象的安全性,不允许servlt程序员在service方法中把servletRequest和servletResponse对象进行强转reques ...

  6. HashMap很美好,但线程不安全怎么办?ConcurrentHashMap告诉你答案!

    写在开头 在<耗时2天,写完HashMap>这篇文章中,我们提到关于HashMap线程不安全的问题,主要存在如下3点风险: 风险1: put的时候导致元素丢失:如两个线程同时put,且ke ...

  7. Apache Hudi 在 vivo 湖仓一体的落地实践

    作者:vivo 互联网大数据团队 - Xu Yu 在增效降本的大背景下,vivo大数据基础团队引入Hudi组件为公司业务部门湖仓加速的场景进行赋能.主要应用在流批同源.实时链路优化及宽表拼接等业务场景 ...

  8. Mysql进阶目录

    一:Mysql字符集问题 二:Mysql_Sql模式 三:Mysql的数据目录 四:Mysql用户管理 五:Mysql权限管理 六: 权限表 七: 角色管理 八: Mysql配置文件的使用 九: My ...

  9. PlacementList must be sorted by first 8 bits of display_id 问题

    问题暂未解决 [37484:0811/103448.115:ERROR:display_layout.cc(551)] PlacementList must be sorted by first 8 ...

  10. pfx文件导出pem和私钥,更换网站域名证书

    openssl 路径: C:\Program Files\OpenSSL-Win64\bin -- 导出pem证书openssl pkcs12 -in C:\BackUp\Lightning\cert ...