acwing 242. 一个简单的整数问题
Posted itdef
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了acwing 242. 一个简单的整数问题相关的知识,希望对你有一定的参考价值。
地址 https://www.acwing.com/problem/content/248/
给定长度为N的数列A,然后输入M行操作指令。
第一类指令形如“C l r d”,表示把数列中第l~r个数都加d。
第二类指令形如“Q X”,表示询问数列中第x个数的值。
对于每个询问,输出一个整数表示答案。
输入格式
第一行包含两个整数N和M。
第二行包含N个整数A[i]。
接下来M行表示M条指令,每条指令的格式如题目描述所示。
输出格式
对于每个询问,输出一个整数表示答案。
每个答案占一行。
数据范围
1≤N,M≤1051≤N,M≤105,
|d|≤10000|d|≤10000,
|A[i]|≤1000000000
输入样例:
10 5
1 2 3 4 5 6 7 8 9 10
Q 4
Q 1
Q 2
C 1 6 3
Q 2
输出样例:
4
1
2
5
区间修改 单点询问 利用差分的树状数组
#include <iostream> #include <vector> #include <algorithm> using namespace std; const int N = 100010; typedef long long ll; typedef long long LL; int n, m; int a[N]; ll tr[N]; int lowbit(int x) { return x & -x; } void add(int x, int c) { for (int i = x; i <= n; i += lowbit(i)) tr[i] += c; } ll sum(int x) { ll res = 0; for (int i = x; i; i -= lowbit(i)) res += tr[i]; return res; } int main() { scanf("%d %d", &n, &m); for (int i = 1; i <= n; i++) scanf("%d", &a[i]); for (int i = 1; i <= n; i++) add(i, a[i] - a[i - 1]); while (m--) { char op[2]; int l, r, d; scanf("%s%d",op,&l); if (*op == ‘C‘) { scanf("%d%d", &r, &d); add(l, d); add(r + 1, -d); } else { printf("%lld\n",sum(l)); } } return 0; }
以上是关于acwing 242. 一个简单的整数问题的主要内容,如果未能解决你的问题,请参考以下文章
AcWing 242 一个简单整数问题(区间修改 单点查询)