题面
在一个荒凉的墓地上,有一个令人尊敬的守墓人, 他看守的墓地从来没有被盗过, 所以人们很放心的把自己的先人的墓安顿在他那
守墓人能看好这片墓地是必然而不是偶然……
因为……守墓人懂风水 0.0
他把墓地分为主要墓碑和次要墓碑, 主要墓碑只能有 \(1\) 个, 守墓人把他记为 \(1\) 号, 而次要墓碑有 \(n-1\) 个,守墓人将之编号为 \(2,3\dots n\),所以构成了一个有 \(n\) 个墓碑的墓地。
而每个墓碑有一个初始的风水值,这些风水值决定了墓地的风水的好坏,所以守墓人需要经常来查询这些墓碑。
善于运用风水的守墓人,通过一次次逆天改命,使得自己拥有了无限寿命,没人知道他活了多久。这天,你幸运的拜访到了他,他要求你和他共同见证接下来几年他的战果,但不过他每次统计风水值之和都需要你来帮他计算,算错了他会要你命 QAQ
风水也不是不可变,除非遭遇特殊情况,已知在接下来的 \(2147483647\) 年里,会有 \(n\) 次灾难,守墓人会有几个操作:
- 将 \([l,r]\) 这个区间所有的墓碑的风水值增加 \(k\)。
2.将主墓碑的风水值增加 \(k\)
3.将主墓碑的风水值减少 \(k\)
4.统计 \([l,r]\) 这个区间所有的墓碑的风水值之和
5.求主墓碑的风水值
上面也说了,很多人会把先人的墓安居在这里,而且守墓人活了很多世纪→_→,墓碑的数量会多的你不敢相信= =
守墓人和善的邀请你帮他完成这些操作,要不然哪天你的旅馆爆炸了,天上下刀子.....
为了活命,还是帮他吧
输入格式
第一行,两个正整数 \(n,f\) 表示共有 \(n\) 块墓碑,并且在接下来的 $2147483647 $年里,会有 \(f\) 次世界末日
第二行,\(n\) 个正整数,表示第 \(i\) 块墓碑的风水值
接下来 \(f\) 行,每行都会有一个针对世界末日的解决方案,如题所述,标记同题
输出格式
输出会有若干行,对 \(4\) 和 \(5\) 的提问做出回答
提示说明
\(20\%\) 的数据满足:\(1\leq n\leq 100\)
\(50\%\) 的数据满足:\(1\leq n\leq 6000\)
\(100\%\) 的数据满足:\(1\leq n,f\leq 2 \times 10^5\),答案不超过 64 位整数。
思路
这道题线段树裸题。
我线段树没有建树调了好久,WA了好久
代码
#include <bits/stdc++.h>
#define int long long
#define ls (i<<1)
#define rs (i<<1|1)
#define mid ((l+r)>>1)
using namespace std;
const int SIZE = 2e5 + 5;
struct node{
int sum, tag;
node(){
tag=0;
sum=0;
}
} t[SIZE << 2];
int a[SIZE];
void pushup(int i) {
t[i].sum = t[ls].sum + t[rs].sum;
}
void pushdown(int i, int l, int r) {
t[ls].tag += t[i].tag;
t[rs].tag += t[i].tag;
t[ls].sum += (mid - l + 1) * t[i].tag;
t[rs].sum += (r - mid) * t[i].tag;
t[i].tag = 0;
}
void build(int i, int l, int r) {
if (l == r) {
t[i].sum = a[l];
return;
}
build(ls, l, mid);
build(rs, mid + 1, r);
pushup(i);
}
void update(int ql, int qr, int v, int i, int l, int r) {
if (ql <= l && r <= qr) {
t[i].sum += (r - l + 1) * v;
t[i].tag += v;
return;
}
pushdown(i, l, r);
if (mid >= ql) {
update(ql, qr, v, ls, l, mid);
}
if (mid < qr) {
update(ql, qr, v, rs, mid + 1, r);
}
pushup(i);
}
int query(int ql, int qr, int i, int l, int r) {
if (ql <= l && r <= qr) {
return t[i].sum;
}
pushdown(i, l, r);
int result = 0;
if (mid >= ql) {
result += query(ql, qr, ls, l, mid);
}
if (mid < qr) {
result += query(ql, qr, rs, mid + 1, r);
}
return result;
}
int n, f;
signed main() {
cin >> n >> f;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
build(1,1,n);
while (f--) {
int op, l, r, k;
cin >> op;
if (op == 1) {
cin >> l >> r >> k;
update(l, r, k, 1, 1, n);
}
if (op == 2) {
cin >> k;
update(1, 1, k, 1, 1, n);
}
if (op == 3) {
cin >> k;
update(1, 1, -k, 1, 1, n);
}
if (op == 4) {
cin >> l >> r;
cout << query(l, r, 1, 1, n) << endl;
}
if (op == 5) {
cout << query(1, 1, 1, 1, n) << endl;
}
}
return 0;
}
标签:qr,int,守墓,墓碑,P2357,风水,ql 来源: https://www.cnblogs.com/xiezheyuan/p/note-rem-p2357.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。