试题链接

题目描述

题意:

有两个序列,
操作1是将a序列的第x位改成y
操作2是将b序列的第x位改成y
操作3是找到一个cx,满足递推式c0=0,ci = max(ci-1+bi,ai)

题解:


官方题解
说实话我没大看懂。。。
题是我同学做的,他的思路是通过这个递推式可以推导出一个式子
然后用两个线段树来维护,一个用来维护ai-si的差值,一个用来维护b的前缀和
u1s1,码风不错,直接学习

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;//simplify long long
typedef unsigned long long ull;
#define inf 2147483647
#define pi 3.14159265358979
#define rep(i, l, r) for(int i = l; i <= r; i ++)
#define lop(i, r, l) for(int i = r; i >= l; i --)
#define step(i, l, r, __step) for(int i = l; i <= r; i += __step)
#define revp(i, r, l, __step) for(int i = r; i >= l; i -= __step)
#define regsiter reg
#define regsiter int RI
#define regsiter long long RL
inline ll read()//fast read
{ll ret = 0, sgn = 1;char chr = getchar();while(chr < '0' || chr > '9'){if(chr == '-') sgn = -1; chr = getchar();}while(chr >= '0' && chr <= '9'){ret = ret * 10 + chr - '0'; chr = getchar();}return ret * sgn;
}
const int N = 2e5 + 5;
int n, m;
struct seg{int l, r;ll sum, maxw, add;
}tr[N << 2][2];
#define ls p << 1
#define rs p << 1 | 1
ll A[N], B[N], S[N], E[N];
inline void update(int p, int t)
{tr[p][t].sum = tr[ls][t].sum + tr[rs][t].sum;tr[p][t].maxw = max(tr[ls][t].maxw, tr[rs][t].maxw);
}
void build(int p, int l, int r, int t)
{tr[p][t].l = l;tr[p][t].r = r;tr[p][t].add = 0;if(l == r){if(!t){tr[p][t].sum = S[l];tr[p][t].maxw = S[l];}else{tr[p][t].sum = E[l];tr[p][t].maxw = E[l];}return;}int mid = l + r >> 1;build(ls, l, mid, t);build(rs, mid + 1, r, t);update(p, t);
}
void pushdown(int p, int t)
{if(tr[p][t].add){ll v = tr[p][t].add;tr[p][t].add = 0;tr[ls][t].add += v;tr[ls][t].sum += v * (tr[ls][t].r - tr[ls][t].l + 1);tr[ls][t].maxw += v;tr[rs][t].add += v;tr[rs][t].sum += v * (tr[rs][t].r - tr[rs][t].l + 1);tr[rs][t].maxw += v;}
}
void modify_add(int p, int l, int r, ll v, int t)
{if(l <= tr[p][t].l && r >= tr[p][t].r){tr[p][t].add += v;tr[p][t].sum += v * (tr[p][t].r - tr[p][t].l + 1);tr[p][t].maxw += v;return;}pushdown(p, t);int mid = tr[p][t].l + tr[p][t].r >> 1;if(l <= mid) modify_add(ls, l, r, v, t);if(r > mid) modify_add(rs, l, r, v, t);update(p, t);
}
ll ask_sum(int p, int l, int r, int t)
{if(l <= tr[p][t].l && r >= tr[p][t].r){return tr[p][t].sum;}pushdown(p, t);int mid = tr[p][t].l + tr[p][t].r >> 1;ll ret = 0;if(l <= mid) ret += ask_sum(ls, l, r, t);if(r > mid) ret += ask_sum(rs, l, r, t);return ret;
}
ll ask_maxw(int p, int l, int r, int t)
{if(l <= tr[p][t].l && r >= tr[p][t].r){return tr[p][t].maxw;}pushdown(p, t);int mid = tr[p][t].l + tr[p][t].r >> 1;ll ret = -inf;if(l <= mid) ret = max(ret, ask_maxw(ls, l, r, t));if(r > mid) ret = max(ret, ask_maxw(rs, l, r, t));return ret;
}
int main()
{while(~scanf("%d%d", &n, &m)){rep(i, 1, n) A[i] = read();rep(i, 1, n) B[i] = read();rep(i, 1, n) S[i] = S[i - 1] + B[i];rep(i, 1, n) E[i] = A[i] - S[i];int op, a;ll b;build(1, 1, n, 0);build(1, 1, n, 1);while(m --){scanf("%d", &op);if(op == 1){scanf("%d%lld", &a, &b);ll v = b - A[a];A[a] = b;modify_add(1, a, a, v, 1);}else if(op == 2){scanf("%d%lld", &a, &b);ll v = b - B[a];B[a] = b;modify_add(1, a, n, v, 0);modify_add(1, a, n, -v, 1);}else{scanf("%d", &a);ll ans = max(ask_maxw(1, 1, a, 1), 0ll) + ask_sum(1, a, a, 0);printf("%lld\n", ans);}}}return 0;
}

Data Structure Problem相关推荐

  1. HDU - 7072 Boring data structure problem 双端队列 + 思维

    传送门 文章目录 题意: 思路: 题意: 你需要实现如下四个操作 q≤1e7q\le1e7q≤1e7 思路: 做的时候想了个链表的思路让队友写了,懒. 看了题解感觉题解还是很妙的. 你需要快速插入一个 ...

  2. 2020ICPC(小米邀请赛2) - Data Structure Problem(线段树+树状数组)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数列 a 和数列 b,然后需要维护一个前缀和 c,c 的定义如下:c[ i ] = max( c[ i - 1 ] + b[ i ] , a[ i ...

  3. Boring data structure problem 模拟-双端队列

    题意 : 维护一个"双端队列",1e7次操作,支持左插入,右插入,按值删除,查找中点(靠右)值ceil[(m+1)/2]ceil[(m + 1) / 2]ceil[(m+1)/2] ...

  4. HDU - 6967 G I love data structure 线段树维护矩阵 + 细节

    传送门 文章目录 题意: 思路: 题意: 给你两个长度为nnn的数组a,ba,ba,b,你需要完成如下四种操作: 思路: 思路还是比较简单的,首先建一颗线段树,线段树中维护a,b,a2,b2,aba, ...

  5. 【HDU - 4217 】Data Structure? (线段树求第k小数)

    题干: Data structure is one of the basic skills for Computer Science students, which is a particular w ...

  6. Data Structure

    Data Structure 1. Abstract Data Type (ADT) 1.1. Data type A set of objects + a set of operations Exa ...

  7. CF data structure 自制题单(一)

    CF data structure 2000~2100 为你的战斗,献上雷鸣般的喝彩!--唔姆 目标 30 道题 1. Problem - 1555E - Codeforces 看了提示 给一些线段, ...

  8. LeetCode Two Sum III - Data structure design

    原题链接在这里:https://leetcode.com/problems/two-sum-iii-data-structure-design/ 题目: Design and implement a ...

  9. leetcode 211. Add and Search Word - Data structure design Trie树

    题目链接 写一个数据结构, 支持两种操作. 加入一个字符串, 查找一个字符串是否存在.查找的时候, '.'可以代表任意一个字符. 显然是Trie树, 添加就是正常的添加, 查找的时候只要dfs查找就可 ...

最新文章

  1. JavaScript 拾碎[一] ECMAScript 简介
  2. SSH加密密码中的非对称式密码学
  3. Android入门(10)| Fragment碎片详解
  4. ESFramework介绍之(14)-- AS与FS通信方案
  5. java环境配置—配置Tomcat8环境
  6. 华为云新春送福,大吉大利今晚红包雨!
  7. Android开发工具集合
  8. excel 科学计数法转换成文本完整显示_Excel中的数字格式和文本格式转换
  9. PHP 身份证验证方法
  10. 计算机 管理 用户,一种计算机系统及管理计算机用户权限的方法_2
  11. DeepFaceLab:视频中有多人,仅替换特定人脸的方法!
  12. Sublime Text3中文版下载网址
  13. 扫脸测试开什么车软件,扫脸测年龄app
  14. QT起一个线程实时监测某个进程是否正常运行
  15. 如何最简单、通俗地理解Python的pandas库?
  16. Linux下安装realtek8812au /8814au 驱动
  17. Snapchat发布不到2个月的故事搜索功能,又双叒被Instagram抄袭了
  18. 《脚本》Scapy刺探星巴克无线网,记录顾客信息
  19. 事物的一级效应、二三级效应
  20. Java学习路线总结(2022版)

热门文章

  1. 量子计算机是程序员的未来,研究者:量子计算机一旦成功问世,时间也许会失去存在的意义...
  2. 黑马c++32期_【每日一考】第40期:计提折旧
  3. java范型_Java知识点总结(Java泛型)
  4. 数字转字符函数_Excel之文本函数CONCATENATE/TEXT/LEFT/MID/RIGHT/FIND/LEN
  5. saiku 连接 MySQL_Saiku连接mysql数据库(二)
  6. matlab优化算法案例分析与应用_最优化计算与matlab实现(18)——粒子群优化算法——权重改进的粒子群算法...
  7. 计算机系统的工作方式,某计算机系统输入/输出采用双缓冲工作方式,其工作过程如下图所示,假设磁盘块与缓冲 - 信管网...
  8. 吴恩达DeepLearningCourse4-卷积神经网络
  9. leedcode344. 反转字符串
  10. leetcode349. 两个数组的交集(思路+详解)