L 苍天阻我寻你,此情坚贞如一(西南科技大学2021届新生赛)(线段树)
苍天阻我寻你,此情坚贞如一
- 把aaa数组中下标为xxx的数修改为yyy。
- 把bbb数组中下标为xxx的数修改为yyy。
- 如果小AAA起始位置在xxx,小BBB起始位置在yyy,问如果他们各自按照数组a,ba, ba,b执行,在第几步能够行动轨迹重合。
接下来如何确定小AAA和小BBB走过的区间,设aaa数组的前缀和数组为sum_asum\_asum_a,bbb数组的前缀和数组为sum_bsum\_bsum_b,
另开四个变量来记录区间[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届新生赛)(线段树)相关推荐
- 线段树维护区间最大值+第 45 届(ICPC)亚洲区域赛(昆明)L题Simone and Graph Coloring
题意: 给你n个数的序列,当满足i<ji<ji<j andandand ai>aja_i>a_jai>aj时,这两个点之间有一条边,现在对点染色,要求每个点相邻 ...
- 【线段树】L - GTY‘s gay friends
题面 http://acm.hdu.edu.cn/showproblem.php?pid=5172 题意 给你n个数,m次查询,每次询问一个区间[l,r],问这个区间[l,r]是否满足[l,r]之间的 ...
- L. Continuous Intervals(单调栈 + 线段树 + 思维)
L. Continuous Intervals 给定一个长度为nnn的数组,问里面有多少个区间[l,r][l, r][l,r],满足,对这个区间排序后,两两差值$ \leq 1$,输出区间个数. 如果 ...
- 2021 ICPC 四川省赛 L - Spicy Restaurant(多源BFS,DP)
Spicy Restaurant https://codeforces.com/gym/103117/problem/L 题目大意:给一个 nnn 个点 mmm 条边的点权图.再给出 qqq 个询问, ...
- 【基本操作】主席数统计区间不同颜色个数
例题:询问 $n$ 个数中无修改的区间不同数个数,不带修改(SPOJ的一道题). 方法1:直接删 我们尝试头铁地开正常的下标主席树! 依次插入 $n$ 个数,插入第 $i$ 个数时,我们只要在把第 $ ...
- uscao 线段树成段更新操作及Lazy思想(POJ3468解题报告)
线段树成段更新操作及Lazy思想(POJ3468解题报告) 标签: treequerybuildn2cstruct 2011-11-03 20:37 5756人阅读 评论(0) 收藏 举报 分类: ...
- 子段乘积(逆元费马小定理)+线段树做法
题解:一开始做这个题的时候想过尺取法,但是因为没有逆元的知识,不知道该如何不断删除左端元素.其实这题并不难想,设l,r为两端开始都置为1,当长度小于k的时候不断乘右端元素并取余,当长度等于k时删除左端 ...
- szu 寒训个人复习第一天 线段树入门单点修改,区间修改,以及线段树的扩展运用[线段树+dp][区间最大公约数]
寒讯内容有点过多(其实是我太菜了)水一波怕忘了(人老了)**什么是线段树** 线段树是本蒟蒻感觉用处特别大的算法 那么线段树上面的节点表示什么意思呢? 线段树,上面的节点表示一个区间,父亲节点表示的区 ...
- 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) ...
最新文章
- 【Qt】在ubuntu上打包发布Qt程序,可以不依赖Qt环境
- mysql5.7 不复制多张表
- 当AI渗透到财务管理 未来人机协作机器人有望“独当一面”
- 模拟四:STEMA 考试选择题模拟练习试卷(中级组)及答案 + 自我解题笔记
- Java中的数组,列表,集合,映射,元组,记录文字
- python 死循环程序能占满cpu吗_运行tensorflow python程序,限制对GPU和CPU的占用操作...
- HDU 1824 Let's go home
- RICOH 身份证 便捷打印
- IPMI 服务器远程管理方法
- 数据库时间相减_SQL 日期相减(间隔)datediff函数,
- Bat 下载文件并处理
- Doom3bfg 技术说明
- postfix邮箱服务器安装和配置
- Java 发送QQ邮件
- 阿里ET大脑如何帮助养猪产业提升PSY从20到32?
- BeanDefinitionParsingException Configuration problem Unabl
- uniapp写微信小程序怎么运行到微信开发工具上
- WuThreat身份安全云-TVD每日漏洞情报-2023-02-07
- 细思极恐!使用 AI 控制你的浏览器
- python练习题 21-30
热门文章
- 为什么接吻需要闭眼睛?
- 大型打脸现场!被藐视的少女摇身一变成为“抽象代数之母”,哲学教授只能跪地喊爸爸...
- 中国数学竞赛史上最玩命的“赌徒”,为了国家荣誉,他不惜用生命换来了五次世界第一...
- 钟南山团队在患者粪便中检出新冠活病毒,国家卫健委回应!专家:做好这事很重要...
- 菜鸟学习数据科学家 5 大误区
- 大数据告诉你,中国女人有多勤奋
- 美国劳工部揭露中国女人大数据,看完彻底傻眼了……
- 锁屏快捷键_全面屏 iPhone 锁屏快捷键美化,让你的 iPhone 更特别
- 抓取手机https_python爬虫入门02:教你通过 Fiddler 进行手机抓包
- php 获取对象所有成员变量,PHP成员变量获取对比