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

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

有三种操作:

如何判定行动轨迹重合:

假设小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_a,bbb数组的前缀和数组为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,l−1]中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;
}

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

  1. 线段树维护区间最大值+第 45 届(ICPC)亚洲区域赛(昆明)L题Simone and Graph Coloring

    题意: 给你n个数的序列,当满足i<ji<ji<j andandand ai>aja_i>a_jai​>aj​时,这两个点之间有一条边,现在对点染色,要求每个点相邻 ...

  2. 【线段树】L - GTY‘s gay friends

    题面 http://acm.hdu.edu.cn/showproblem.php?pid=5172 题意 给你n个数,m次查询,每次询问一个区间[l,r],问这个区间[l,r]是否满足[l,r]之间的 ...

  3. L. Continuous Intervals(单调栈 + 线段树 + 思维)

    L. Continuous Intervals 给定一个长度为nnn的数组,问里面有多少个区间[l,r][l, r][l,r],满足,对这个区间排序后,两两差值$ \leq 1$,输出区间个数. 如果 ...

  4. 2021 ICPC 四川省赛 L - Spicy Restaurant(多源BFS,DP)

    Spicy Restaurant https://codeforces.com/gym/103117/problem/L 题目大意:给一个 nnn 个点 mmm 条边的点权图.再给出 qqq 个询问, ...

  5. 【基本操作】主席数统计区间不同颜色个数

    例题:询问 $n$ 个数中无修改的区间不同数个数,不带修改(SPOJ的一道题). 方法1:直接删 我们尝试头铁地开正常的下标主席树! 依次插入 $n$ 个数,插入第 $i$ 个数时,我们只要在把第 $ ...

  6. uscao 线段树成段更新操作及Lazy思想(POJ3468解题报告)

    线段树成段更新操作及Lazy思想(POJ3468解题报告) 标签: treequerybuildn2cstruct 2011-11-03 20:37 5756人阅读 评论(0) 收藏 举报  分类: ...

  7. 子段乘积(逆元费马小定理)+线段树做法

    题解:一开始做这个题的时候想过尺取法,但是因为没有逆元的知识,不知道该如何不断删除左端元素.其实这题并不难想,设l,r为两端开始都置为1,当长度小于k的时候不断乘右端元素并取余,当长度等于k时删除左端 ...

  8. szu 寒训个人复习第一天 线段树入门单点修改,区间修改,以及线段树的扩展运用[线段树+dp][区间最大公约数]

    寒讯内容有点过多(其实是我太菜了)水一波怕忘了(人老了)**什么是线段树** 线段树是本蒟蒻感觉用处特别大的算法 那么线段树上面的节点表示什么意思呢? 线段树,上面的节点表示一个区间,父亲节点表示的区 ...

  9. UVA122 树的层次遍历 Trees on the level(两种方法详解)

    UVA122 树的层次遍历 Trees on the level 输入: (11,LL) (7,LLL) (8,R) (5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) ...

最新文章

  1. 【Qt】在ubuntu上打包发布Qt程序,可以不依赖Qt环境
  2. mysql5.7 不复制多张表
  3. 当AI渗透到财务管理 未来人机协作机器人有望“独当一面”
  4. 模拟四:STEMA 考试选择题模拟练习试卷(中级组)及答案 + 自我解题笔记
  5. Java中的数组,列表,集合,映射,元组,记录文字
  6. python 死循环程序能占满cpu吗_运行tensorflow python程序,限制对GPU和CPU的占用操作...
  7. HDU 1824 Let's go home
  8. RICOH 身份证 便捷打印
  9. IPMI 服务器远程管理方法
  10. 数据库时间相减_SQL 日期相减(间隔)datediff函数,
  11. Bat 下载文件并处理
  12. Doom3bfg 技术说明
  13. postfix邮箱服务器安装和配置
  14. Java 发送QQ邮件
  15. 阿里ET大脑如何帮助养猪产业提升PSY从20到32?
  16. BeanDefinitionParsingException Configuration problem Unabl
  17. uniapp写微信小程序怎么运行到微信开发工具上
  18. WuThreat身份安全云-TVD每日漏洞情报-2023-02-07
  19. 细思极恐!使用 AI 控制你的浏览器
  20. python练习题 21-30

热门文章

  1. 为什么接吻需要闭眼睛?
  2. 大型打脸现场!被藐视的少女摇身一变成为“抽象代数之母”,哲学教授只能跪地喊爸爸...
  3. 中国数学竞赛史上最玩命的“赌徒”,为了国家荣誉,他不惜用生命换来了五次世界第一...
  4. 钟南山团队在患者粪便中检出新冠活病毒,国家卫健委回应!专家:做好这事很重要...
  5. 菜鸟学习数据科学家 5 大误区
  6. 大数据告诉你,中国女人有多勤奋
  7. 美国劳工部揭露中国女人大数据,看完彻底傻眼了……
  8. 锁屏快捷键_全面屏 iPhone 锁屏快捷键美化,让你的 iPhone 更特别
  9. 抓取手机https_python爬虫入门02:教你通过 Fiddler 进行手机抓包
  10. php 获取对象所有成员变量,PHP成员变量获取对比