JZOJ 7685. 【2022.10.06冲剌NOIP2022模拟】奇怪的函数(function)
\(\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)的更多相关文章
- Python面向对象06 /元类type、反射、函数与类的区别、特殊的双下方法
Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 目录 Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 1. 元类type 2. 反射 3 ...
- 06 返回静态文件的映射(函数/多线程)web框架
06 返回静态文件的映射(函数/多线程)web框架 服务器server端python程序(函数版): import socket server = socket.socket() server.bin ...
- 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 ...
- 10.06 WZZX Day1总结
今天迎来了WZZX的模拟.打开pdf的时候我特别震惊,出题的竟然是神仙KCZ!没错,就是那个活跃于各大OJ,在各大OJ排名靠前(LOJ Rank1),NOI2018 Rank16进队的kczno1!! ...
- 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 ...
- Murano Weekly Meeting 2015.10.06
Meeting time: 2015.October.6th 1:00~2:00 Chairperson: Kirill Zaitsev, from Mirantis Meeting summar ...
- 【OI新闻】2016.10.06
今天有人说好多OJ都狗记邓了- 翻了一下,恭喜以下OJ赢得大奖,获得狗记邓徽章一枚 一等奖Codevs 二等奖Bzoj 三等奖洛谷 后记-感悟 如果正在为OJ发愁的朋友,不要悲伤,不要心急,换一换OJ ...
- 6380. 【NOIP2019模拟2019.10.06】小w与最长路(path)
题目 题目大意 给你一棵树,对于每一条边,求删去这条边之后,再用一条边(自己定)连接两个连通块,形成的树的直径最小是多少. 正解 首先,将这棵树的直径给找出来.显然,如果删去的边不在直径上,那么答案就 ...
- PHP里10个鲜为人知但却非常有用的函数
levenshtein() 你有没有经历过需要知道两个单词有多大的不同的时候,这个函数就是来帮你解决这个问题的.它能比较出两个字符串的不同程度. 用法: <?php $str1 = " ...
- python3 第十九章 - 写一个10进制转任意进制的函数
我们先回忆下之前所学的进制转换的知识(详见:第十章),10进制转其它进制的方法是: 整数部分,除基取余,逆序排列 小数部分,乘基取整,顺序排列 负数,按绝对值处理 好,假设我们需要转化的数都是正整数, ...
随机推荐
- lightdm开机无法自启问题
简述 由于我学习了 systemctl disable 服务 这条命令,然后开始皮,把 lightdm 自启动关了,然后开不开了 解决办法:重置 lightdm 服务配置 sudo dpkg-reco ...
- whylogs工具库的工业实践!机器学习模型流程与效果监控 ⛵
作者:韩信子@ShowMeAI 机器学习实战系列:https://www.showmeai.tech/tutorials/41 本文地址:https://www.showmeai.tech/artic ...
- 【SQL真题】SQL1: 各个视频的平均完播率 【AVG/SUM/IF/CASE】
题目: https://www.nowcoder.com/practice/96263162f69a48df9d84a93c71045753?tpId=268&tqId=2285032& ...
- 18V降压3.3V,15V降压3.3V的降压IC和LDO芯片方案
在 18V 和 15V 输入中,我们需要给其他电源电路提高供电,有的电路的供电电压在 5V,或者是 3.3V 时, 我们就需要使用降压芯片来组建一个降压电路来给后面的的电路,提供稳定的,持续的 3.3 ...
- Ubuntu 22.04 搭建K8s集群
目录 1. 虚拟机基础配置 配置静态ip 设置主机名 设置hosts 安装ssh 2. Ubuntu系统设置 禁用swap 修改内核参数 3. 安装containerd 4. 安装Kubernetes ...
- git cherry-pick 同步修改到另一个分支
我们在开发中有时会遇到,需要将另一个分支部分修改同步到当前分支. 如下图,想把 devA 分支中 commit E 和 F,同步到下面绿色的 devB 分支中. 这时候就可以使用 git cherry ...
- Vue element 自定义表单验证(验证手机号)
<el-form :model="ruleForm" status-icon :rules="rules" ref="ruleForm" ...
- 分享一个自己在用的.net 中mysql事务控制类(支持多条sql,参数化,自定义判断条件,错误点返回等)
1)首先看下事务控制器. using MySql.Data.MySqlClient; using System; using System.Collections.Generic; using Sys ...
- [seaborn] seaborn学习笔记4-核密度图DENSITYPLOT
文章目录 4 核密度图Densityplot 1. 基础核密度图绘制 Basic density plot 2. 核密度图的区间控制 Control bandwidth of density plot ...
- Lombok中@Builder和@SuperBuilder注解的用法
@Builder 是 lombok 中的注解.可以使用builder()构造的Person.PersonBuilder对象进行链式调用,给所有属性依次赋值. Person person1 = Pers ...