\(\text{Solution}\)

观察到关于 \(x\) 的函数在 \(n\) 个操作之后一定是这样的:

一段水平直线加上一段斜率为 \(1\) 的直线再加上一段水平直线

于是线段树维护这个分段函数即可

因为我是用斜率为 \(1\) 的直线的起点和终点坐标反应这个函数

所以合并分段函数的时候要处理退化成一条水平直线的情况

然而考场忘了判。。。

不过这个第一次写数据结构维护分段函数呢

当然码量更少且不需要合并函数的做法是分块啦

维护每个块的函数,一次修改直接 \(O(\sqrt n)\) 重构

\(\text{Code}\)

#include <cstdio>
#include <iostream>
#define IN inline
using namespace std; template <typename T>
IN void read(T &x) {
x = 0; char ch = getchar(); int f = 0;
for(; !isdigit(ch); f = (ch == '-' ? 1 : f), ch = getchar());
for(; isdigit(ch); x = (x<<3)+(x<<1)+(ch^48), ch = getchar());
if (f) x = ~x + 1;
} const int N = 1e5 + 5, len = 2e8;
int n, q; #define ls (p << 1)
#define rs (ls | 1)
#define mid (l + r >> 1) struct SegmentTree {
int x0, x1, y0, y1;
IN int F(int x) {return ((x <= x0) ? y0 : ((x >= x1) ? y1 : x - x0 + y0));}
IN int nF_max(int y) {
return ((y < y0 || y > y1) ? -1 : ((y == y0) ? x0 : ((y == y1) ? len : y - y0 + x0)));
}
IN int nF_min(int y) {
return ((y < y0 || y > y1) ? -1 : ((y == y0) ? 1 : ((y == y1) ? x1 : y - y0 + x0)));
}
}seg[N * 4]; IN void single(int p, int op, int val) {
seg[p].x0 = seg[p].y0 = 1, seg[p].x1 = seg[p].y1 = len;
if (op == 1) seg[p].y0 += val, seg[p].y1 += val;
else if (op == 2) seg[p].x1 = seg[p].y1 = val;
else seg[p].x0 = seg[p].y0 = val;
}
IN void pushup(int p) {
seg[p].y0 = seg[rs].y0, seg[p].y1 = seg[rs].y1;
seg[p].x0 = seg[ls].nF_max(seg[rs].x0);
if (seg[p].x0 == -1) seg[p].x0 = seg[ls].x0, seg[p].y0 = seg[rs].F(seg[ls].y0);
seg[p].x1 = seg[ls].nF_min(seg[rs].x1);
if (seg[p].x1 == -1) seg[p].x1 = seg[ls].x1, seg[p].y1 = seg[rs].F(seg[ls].y1);
if (seg[p].y0 == seg[p].y1) seg[p].x0 = seg[p].x1 = 1;
}
void build(int p, int l, int r) {
if (l == r) {int op, val; read(op), read(val), single(p, op, val); return;}
build(ls, l, mid), build(rs, mid + 1, r), pushup(p);
}
void modify(int p, int l, int r, int x, int op, int val) {
if (l == r) return single(p, op, val), void();
((x <= mid) ? modify(ls, l, mid, x, op, val) : modify(rs, mid + 1, r, x, op, val));
pushup(p);
} int main() {
freopen("function.in", "r", stdin);
freopen("function.out", "w", stdout);
read(n), build(1, 1, n), read(q);
for(int op, pos, val; q; --q) {
read(op), read(pos);
if (op == 4) printf("%d\n", seg[1].F(pos));
else read(val), modify(1, 1, n, pos, op, val);
}
}

JZOJ 7685. 【2022.10.06冲剌NOIP2022模拟】奇怪的函数(function)的更多相关文章

  1. Python面向对象06 /元类type、反射、函数与类的区别、特殊的双下方法

    Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 目录 Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 1. 元类type 2. 反射 3 ...

  2. 06 返回静态文件的映射(函数/多线程)web框架

    06 返回静态文件的映射(函数/多线程)web框架 服务器server端python程序(函数版): import socket server = socket.socket() server.bin ...

  3. shell脚本中的几个括号总结(小括号/大括号/花括号)--from:http://www.cnblogs.com/hanyan225/archive/2011/10/06/2199652.html

    在Shell中的小括号,大括号结构和有括号的变量,命令的用法如下: 1.${var}2.$(cmd)3.()和{}4.${var:-string},${var:+string},${var:=stri ...

  4. 10.06 WZZX Day1总结

    今天迎来了WZZX的模拟.打开pdf的时候我特别震惊,出题的竟然是神仙KCZ!没错,就是那个活跃于各大OJ,在各大OJ排名靠前(LOJ Rank1),NOI2018 Rank16进队的kczno1!! ...

  5. hdu1081 To The Max 2016-09-11 10:06 29人阅读 评论(0) 收藏

    To The Max Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total ...

  6. Murano Weekly Meeting 2015.10.06

    Meeting time:  2015.October.6th 1:00~2:00 Chairperson:  Kirill Zaitsev, from Mirantis Meeting summar ...

  7. 【OI新闻】2016.10.06

    今天有人说好多OJ都狗记邓了- 翻了一下,恭喜以下OJ赢得大奖,获得狗记邓徽章一枚 一等奖Codevs 二等奖Bzoj 三等奖洛谷 后记-感悟 如果正在为OJ发愁的朋友,不要悲伤,不要心急,换一换OJ ...

  8. 6380. 【NOIP2019模拟2019.10.06】小w与最长路(path)

    题目 题目大意 给你一棵树,对于每一条边,求删去这条边之后,再用一条边(自己定)连接两个连通块,形成的树的直径最小是多少. 正解 首先,将这棵树的直径给找出来.显然,如果删去的边不在直径上,那么答案就 ...

  9. PHP里10个鲜为人知但却非常有用的函数

    levenshtein() 你有没有经历过需要知道两个单词有多大的不同的时候,这个函数就是来帮你解决这个问题的.它能比较出两个字符串的不同程度. 用法: <?php $str1 = " ...

  10. python3 第十九章 - 写一个10进制转任意进制的函数

    我们先回忆下之前所学的进制转换的知识(详见:第十章),10进制转其它进制的方法是: 整数部分,除基取余,逆序排列 小数部分,乘基取整,顺序排列 负数,按绝对值处理 好,假设我们需要转化的数都是正整数, ...

随机推荐

  1. vscode配置remote ssh

    前言 简单用vscode配置 remote ssh可以实现,通过ssh 在线使用vscode编辑文件,很方便,也遇到一些坑. 安装插件 设置界面 右键最左边tab栏: 勾选 远程资源管理器 添加远程服 ...

  2. docker给已存在的容器添加或修改端口映射

    简述: 这几天研究了一下docker, 发现建立完一个容器后不能增加端口映射了,因为 docker run -p 有 -p 参数,但是 docker start 没有 -p 参数,让我很苦恼,无奈谷歌 ...

  3. MISC图片批量处理jio本

    此处以ctfshow中MISC入门题目作为切入点 感兴趣的同学可以一边做题一边参照 批量修改PNG图片的宽 import zlib import struct filename = "fla ...

  4. Gepetto:使用chatGPT来对函数功能进行分析并重命名变量的IDA插件

    最近OpenAI的chatGPT很火,chatGPT是一个大型的语言模型,能够生成人类语言的文本,主要用于对话式的问答和聊天,以及模拟人类的对话行为 有关chatGPT的介绍就不多赘述了,相关内容很多 ...

  5. 常用内置模块os sys json

    今日内容回顾 目录 今日内容回顾 os模块 sys模块 json模块 json模块实战 os模块 sys模块 json模块 os模块 os模块主要与代码运行的操作系统打交道 1.创建目录(文件夹) i ...

  6. NeurIPS 2022:基于语义聚合的对比式自监督学习方法

    摘要:该论文将同一图像不同视角图像块内的语义一致的图像区域视为正样本对,语义不同的图像区域视为负样本对. 本文分享自华为云社区<[NeurIPS 2022]基于语义聚合的对比式自监督学习方法&g ...

  7. cmd命令行ssh连接Linux服务器

    打开cmd工具 使用命令ssh连接服务器 ssh 用户名@ip地址 (不需要指定端口号,默认端口就是22) 输入密码即可

  8. Redis网络模型究竟有多强

    如果面试官问我:Redis为什么这么快? 我肯定会说:因为Redis是内存数据库!如果不是直接把数据放在内存里,甭管怎么优化数据结构.设计怎样的网络I/O模型,都不可能达到如今这般的执行效率. 但是这 ...

  9. 常用 Git 命令行操作

    本文记录了一些常用 Git 命令行操作的具体使用方式 git clone git clone REPOSITORY_URL 拉取仓库,并使用仓库名作为本地文件名 git clone REPOSITOR ...

  10. 【深入浅出Sentinel原理及实战】「基础实战专题」零基础实现服务流量控制实战开发指南(2)

    你若要喜爱你自己的价值,你就得给世界创造价值. Sentinel的组成部分 Sentinel 主要由以下两个部分组成. Sentinel核心库(Java客户端) :Sentinel的核心库不依赖任何框 ...