355 字
2 分钟
AtCoder ABC442_D: D - Swap and Range Sum Editorial
题目链接
题目大意
给定一个长度为 的整数序列 。
你需要按顺序处理 个查询,查询分为以下两种类型:
- 修改操作
1 x:交换序列中第 个元素 和第 个元素 的值(其中 )。 - 查询操作
2 l r:计算并输出区间 内所有元素的和,即 。
数据范围与约束:
解题思路
对于此题,我们需要考虑交换 与 会对前缀和造成什么后果。
令 为前缀和数组。
- 对于 , 还是和原来未交换的结果一致,为 。
- 对于 , 也和原来未交换的结果一致(因为集合元素没变,只是顺序变了),为 。
受到影响的只有 :
- 原
- 交换后的
结论:
- 当
operator == 1时,我们只需要更新 ,并记得在原数组中交换 与 。 - 当
operator == 2时,正常利用前缀和计算区间和即可。
代码实现
#include <bits/stdc++.h>using namespace std;const int N=2e5+10;typedef long long ll;ll sum[N], a[N];int n, q, op, l, r, x;int main(){ scanf("%d%d", &n, &q); for(int i=1;i<=n;i++) { scanf("%lld", &a[i]); sum[i]=sum[i-1]+a[i]; } while(q--){ scanf("%d", &op); if(op==1) { scanf("%d", &x); sum[x]=sum[x-1]+a[x+1]; swap(a[x], a[x+1]); } else { scanf("%d%d", &l, &r); printf("%lld\n", sum[r]-sum[l-1]); } } return 0;} AtCoder ABC442_D: D - Swap and Range Sum Editorial
https://shenyize.com/posts/atcoder/abc442d/