L 苍天阻我寻你,此情坚贞如一(西南科技大学2021届新生赛)(线段树)

苍天阻我寻你,此情坚贞如一

给定两个长度为nnn的数组a,ba, ba,b,满足−103≤ai,bi≤103-10 ^ 3 \leq a_i, b_i \leq 10 ^ 3103ai,bi103,每个数字xxx表示向前走xxx步,如果是负数则后退嘛,设小AAA执行aaa数组,小BBB执行bbb数组。

有三种操作:

  • aaa数组中下标为xxx的数修改为yyy
  • bbb数组中下标为xxx的数修改为yyy
  • 如果小AAA起始位置在xxx,小BBB起始位置在yyy,问如果他们各自按照数组a,ba, ba,b执行,在第几步能够行动轨迹重合。

如何判定行动轨迹重合:

假设小AAA走过的区间为[l1,r1][l1, r1][l1,r1],小BBB走过的区间为[l2,r2][l2, r2][l2,r2],如果重合则有max(l1,l2)≤min(r1,r2)max(l1, l2) \leq min(r1, r2)max(l1,l2)min(r1,r2)

接下来如何确定小AAA和小BBB走过的区间,设aaa数组的前缀和数组为sum_asum\_asum_abbb数组的前缀和数组为sum_bsum\_bsum_b

数组sum_asum\_asum_a的前缀最小,前缀最大值数组为min_a,max_amin\_a, max\_amin_a,max_a,数组sum_bsum\_bsum_b的前缀最小,前缀最大值数组为min_b,max_bmin\_b, max\_bmin_b,max_b

由小AAA,小BBB的初始位置x,yx, yx,y,可以确定l1=min(x,x+min_a,r1=max(x,x+max_a),l2=min(y,y+min_b,r2=max(y,y+max_b)l1 = min(x, x + min\_a, r1 = max(x, x + max\_a), l2 = min(y, y + min\_b, r2 = max(y, y + max\_b)l1=min(x,x+min_a,r1=max(x,x+max_a),l2=min(y,y+min_b,r2=max(y,y+max_b)

所以有一个较为暴力的算法 二分 + 线段树checkcheckcheck答案,当时这样操作复杂度是O(nlog⁡2n)O(n \log ^ 2 n)O(nlog2n)的,对于n=106n = 10 ^ 6n=106的数据显然是不可行的。

考虑线段树上二分:

假设当前答案在区间为[l,r][l, r][l,r],如果答案在[mid+1,r][mid + 1, r][mid+1,r]上,一定有[1,mid][1, mid][1,mid]这段区间的前缀最大,前缀最小得到的两个区间是不相交的,

另开四个变量来记录区间[1,l−1][1, l - 1][1,l1]AAA的前缀最小, 最大,BBB的前缀最小,最大,

用这四个变量跟区间[l,mid][l, mid][l,mid]的最大最小来判断,答案是否落在[l,mid][l, mid][l,mid]之间,直到递归到叶节点,进行判断是否符合条件即可。

#include <bits/stdc++.h>
#define mid (l + r >> 1)
#define lson rt << 1, l, mid
#define rson rt << 1 | 1, mid + 1, r
#define ls rt << 1
#define rs rt << 1 | 1using namespace std;typedef pair<int, int> pii;const int N = 1e6 + 10;int a[N], b[N], sum[N], n, m;struct Seg_tree {int maxn[N << 2], minn[N << 2], lazy[N << 2];void push_up(int rt) {minn[rt] = min(minn[ls], minn[rs]);maxn[rt] = max(maxn[ls], maxn[rs]);}void push_down(int rt) {if (!lazy[rt]) {return ;}lazy[ls] += lazy[rt], lazy[rs] += lazy[rt];minn[ls] += lazy[rt], minn[rs] += lazy[rt];maxn[ls] += lazy[rt], maxn[rs] += lazy[rt];lazy[rt] = 0;}void build(int rt, int l, int r) {if (l == r) {maxn[rt] = minn[rt] = sum[l];return ;}build(lson);build(rson);push_up(rt);}void update(int rt, int l, int r, int L, int R, int v) {if (l >= L && r <= R) {lazy[rt] += v;minn[rt] += v, maxn[rt] += v;return ;}push_down(rt);if (L <= mid) {update(lson, L, R, v);}if (R > mid) {update(rson, L, R, v);}push_up(rt);}pii query(int rt, int l, int r, int L, int R) {if (l >= L && r <= R) {return {minn[rt], maxn[rt]};}push_down(rt);pii ans = {0x3f3f3f3f, -0x3f3f3f3f};if (L <= mid) {pii res = query(lson, L, R);ans.first = min(ans.first, res.first);ans.second = max(ans.second, res.second);}if (R > mid) {pii res = query(rson, L, R);ans.first = min(ans.first, res.first);ans.second = max(ans.second, res.second);}return ans;}
}A, B;bool judge(int l1, int r1, int l2, int r2, int x, int y) {l1 = min(x, x + l1), r1 = max(x, x + r1);l2 = min(y, y + l2), r2 = max(y, y + r2);int L = max(l1, l2), R = min(r1, r2);return L <= R;
}int query(int rt, int l, int r, int min_a, int max_a, int min_b, int max_b, int x, int y) {if (l == r) {int cur_mina = min(min_a, A.minn[rt]), cur_maxa = max(max_a, A.maxn[rt]);int cur_minb = min(min_b, B.minn[rt]), cur_maxb = max(max_b, B.maxn[rt]);if (judge(cur_mina, cur_maxa, cur_minb, cur_maxb, x, y)) {return l;}return -1;}A.push_down(rt), B.push_down(rt);int cur_mina = min(min_a, A.minn[ls]), cur_maxa = max(max_a, A.maxn[ls]);int cur_minb = min(min_b, B.minn[ls]), cur_maxb = max(max_b, B.maxn[ls]);if (judge(cur_mina, cur_maxa, cur_minb, cur_maxb, x, y)) {return query(lson, min_a, max_a, min_b, max_b, x, y);}else {return query(rson, cur_mina, cur_maxa, cur_minb, cur_maxb, x, y);}
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);scanf("%d %d", &n, &m);for (int i = 1; i <= n; i++) {scanf("%d", &a[i]);sum[i] = sum[i - 1] + a[i];}A.build(1, 1, n);for (int i = 1; i <= n; i++) {scanf("%d", &b[i]);sum[i] = sum[i - 1] + b[i];}B.build(1, 1, n);for (int i = 1, op, x, y; i <= m; i++) {scanf("%d %d %d", &op, &x, &y);if (op == 1) {A.update(1, 1, n, x, n, -a[x]);a[x] = y;A.update(1, 1, n, x, n, a[x]);}else if (op == 2) {B.update(1, 1, n, x, n, -b[x]);b[x] = y;B.update(1, 1, n, x, n, b[x]);}else {if (x == y) {puts("0");continue;}printf("%d\n", query(1, 1, n, 0x3f3f3f3f, 0, 0x3f3f3f3f, 0, x, y));}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313821.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java并发常用方法 sleep 和 wait

一&#xff1a;sleep 和 wait sleep()方法&#xff1a; 功能&#xff1a;让当前线程休眠指定时间&#xff0c;休眠时间的准确性依赖于系统时钟和CPU调度机制是Thread类的静态方法可在任何地方调用&#xff0c;需要处理InterruptedException当前线程调用sleep()方法&#xff0…

.NET Core 3.0之深入源码理解Host(二)

写在前面停了近一个月的技术博客&#xff0c;随着正式脱离996的魔窟&#xff0c;接下来也正式恢复了。本文从源码角度进一步讨论.NET Core 3.0 中关于Host扩展的一些技术点&#xff0c;主要内容是关于创建Long Run Program的创建与守护。关于Host&#xff0c;我们最容易想到的就…

Finding Hotels(牛客国庆集训派对Day7 )(2016ICPC青岛K)(K-D Tree)

Finding Hotels 给定二维平面上nnn个点&#xff0c;每个点描述为x,y,cx, y, cx,y,c&#xff0c;x,yx, yx,y为坐标&#xff0c;ccc为该点的价值&#xff0c; 有mmm个询问&#xff0c;每次询问给x,y,cx, y, cx,y,c&#xff0c;要求&#xff0c;点的价值小于等于ccc的条件下&…

Java多线程常用方法 wait 和 notify

一&#xff1a;从一道面试题说起 启动两个线程, 一个输出 1,3,5,7…99, 另一个输出 2,4,6,8…100 最后 STDOUT 中按序输出 1,2,3,4,5…100 要求用 Java 的 wait notify 机制来实现 解法&#xff1a; public class Test {private static Object lock new Object();private st…

dotNET Core实现分布式环境下的流水号唯一

业务背景在管理系统中&#xff0c;很多功能模块都会涉及到各种类型的编号&#xff0c;例如&#xff1a;流程编号、订单号、合同编号等等。编号各有各自的规则&#xff0c;但通常有一个流水号来确定编号的唯一性&#xff0c;保证流水号的唯一&#xff0c;在不同的环境中实现方式…

单位根反演小记

单位根反演 一个等式&#xff1a;[n∣a]1n∑k0n−1wnak[n \mid a] \frac{1}{n} \sum\limits_{k 0} ^{n - 1}w_n ^{ak}[n∣a]n1​k0∑n−1​wnak​ 证明&#xff1a; wnaw_n ^ awna​是nnn次单位根的aaa次方&#xff0c;所以这里是一个公比为wnaw_n ^ awna​的等比数列&…

.NET Core3发布Json API

我们给DNC3&#xff08;.NET Core 3&#xff09;上了一个新包&#xff0c;叫做System.Text.Json(点我下载)&#xff0c;支持读写器&#xff0c;DOM&#xff08;文档对象模型&#xff09;&#xff0c;和序列化&#xff0c;在这篇博文里&#xff0c;我会告诉大家为什么要做这个&a…

Java ThreadLocal

** 一&#xff1a;ThreadLocal的简要介绍及使用 ** Java中的ThreadLocal类允许我们创建只能被同一个线程读写的变量。因此&#xff0c;如果一段代码含有一个ThreadLocal变量的引用&#xff0c;即使两个线程同时执行这段代码&#xff0c;它们也无法访问到对方的ThreadLocal变…

P5591 小猪佩奇学数学(单位根反演)

P5591 小猪佩奇学数学 ∑i0n(in)pi⌊ik⌋⌊ik⌋i−i%kk1k∑i0n(in)pi(i−i%k)1k∑i0n(in)pii−1k∑i0n(in)pi(imodk)\sum_{i 0} ^{n} (_i ^ n) \times p ^ i \times \lfloor \frac{i}{k} \rfloor\\ \lfloor \frac{i}{k} \rfloor \frac{i - i \% k}{k}\\ \frac{1}{k} \sum_{i …

认证方案之初步认识JWT

前言&#xff1a;现在越来越多的项目或多或少会用到JWT&#xff0c;为什么会出现使用JWT这样的场景的呢&#xff1f;假设现在有一个APP&#xff0c;后台是分布式系统。APP的首页模块部署在上海机房的服务器上&#xff0c;子页面模块部署在深圳机房的服务器上。此时你从首页登录…

Java实现生产消费模型的5种方式

** 前言 ** 生产者和消费者问题是线程模型中的经典问题&#xff1a;生产者和消费者在同一时间段内共用同一个存储空间&#xff0c;生产者往存储空间中添加产品&#xff0c;消费者从存储空间中取走产品&#xff0c;当存储空间为空时&#xff0c;消费者阻塞&#xff0c;当存储…

C#.NET 一颗璀璨的全能明星

C# 是微软推出的一种基于.NET框架的、面向对象的高级编程语言&#xff0c;她可以做什么呢&#xff1f;1.桌面开发&#xff0c;WinForm/GUI可视化编程&#xff1a;Windows开发中的葵花宝典&#xff0c;霸主地位至今无出其右&#xff0c;开发效率令人发指&#xff0c;大部分营销软…

#3328. PYXFIB(单位根反演)

#3328. PYXFIB ∑i0⌊nk⌋CnikFik∑i0nCniFi[i≡0(modk)]i≡0(modk)&#xff0c;单位根反演有1k∑j0k−1wkij1k∑i0nCniFi∑j0k−1wkij\sum_{i 0} ^{\lfloor \frac{n}{k} \rfloor} C_{n} ^{i \times k} \times F_{i \times k}\\ \sum_{i 0} ^{n} C_n ^{i} \times F_i \times …

Leetcode 86. 分隔链表

给定一个链表和一个特定值 x&#xff0c;对链表进行分隔&#xff0c;使得所有小于 x 的节点都在大于或等于 x 的节点之前。你应当保留两个分区中每个节点的初始相对位置。示例:输入: head 1->4->3->2->5->2, x 3输出: 1->2->2->4->3->5题目分析…

深入理解 JVM Class文件格式(一)

** 一、JVM体系结构 ** ** 二、class格式文件概述 ** class文件是一种8位字节的二进制流文件&#xff0c; 各个数据项按顺序紧密的从前向后排列&#xff0c; 相邻的项之间没有间隙&#xff0c; 这样可以使得class文件非常紧凑&#xff0c; 体积轻巧&#xff0c; 可以被J…

min_25 推导及例题总结

min_25 筛 一个亚线性筛&#xff0c;复杂度大概是O(n34log⁡n)O(\frac{n ^{\frac{3}{4}}}{ \log n})O(lognn43​​)。 使用min_25min\_25min_25求前缀和&#xff0c;有两个基本特征&#xff1a;① 积性函数&#xff0c;② 满足质数点为多项式。 算法思路 给定n≤1011n \leq…

asp.net core 使用 signalR(一)

asp.net core 使用 signalR&#xff08;一&#xff09;IntroSignalR 是什么&#xff1f;ASP.NET Core SignalR 是一个开源代码库&#xff0c;它简化了向应用添加实时 Web 功能的过程。实时 Web 功能使服务器端代码能够即时将内容推送到客户端。SignalR 的适用对象&#xff1a;需…

深入理解 JVM Class文件格式(二)

** class文件中的特殊字符串 ** 特殊字符串是常量池中符号引用的一部分&#xff0c;包括三种&#xff1a; 类的全限定名&#xff0c; 字段和方法的描述符&#xff0c; 特殊方法的方法名。 下面我们就分别介绍这三种特殊字符串。 &#xff08;1&#xff09; 类的全限定名 在…

P4211 [LNOI2014]LCA(离线 + 在线 做法)

P4211 [LNOI2014]LCA 有一棵根节点为111树&#xff0c;有mmm次询问&#xff0c;每次给定l,r,zl, r, zl,r,z&#xff0c;输出∑ilrdep[lca(i,z)]\sum\limits_{i l} ^{r} dep[lca(i, z)]il∑r​dep[lca(i,z)]。 乍一看这题好像无从下手&#xff0c;仔细想想lca(i,z)lca(i, z)l…

.NET框架之“小马过河”

.NET框架之“小马过河”有许多流行的 .NET框架&#xff0c;大家都觉得挺“重”&#xff0c;认为很麻烦&#xff0c;重量级&#xff0c;不如其它“轻量级”框架&#xff0c;从而不愿意使用。面对形形色色的框架发愁&#xff0c;笔者也曾发愁。但我发现只要敢于尝试&#xff0c;这…