区间查询
题目大意
一开始有 n n n 个数,编号 [ 1 , n ] [1,n] [1,n],初始值为 1 1 1。
q q q 次查询,每次修改某区间的每个数为 i , i ∈ [ 1 , 3 ] i, i \in [1,3] i,i∈[1,3]。
最后求所有数总和。
解题思路
1.线段树的区间修改。最后查询的是根节点的值。
2.线段树 t r e e [ i ] . v a l tree[i].val tree[i].val 代表区间 [ l , r ] [l,r] [l,r] 的总和。
参考代码
#include<stdio.h>
#include<iostream>
#include<vector>
#include<cstring>
#include<cstdio>
#include<climits>
#include<cmath>
#include<algorithm>
#include<queue>
#include<deque>
#include<map>
#include<unordered_map>
#include<set>
#include<stack>
//#define LOCAL //提交时一定注释
#define VI vector<int>
#define eps 1e-8
#define io ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
using namespace std;
typedef long long LL;
typedef double db;
const int inf = 0x3f3f3f3f;
const LL INF = 1e18;
const int N = 1e5 + 10;
#define ls rt << 1
#define rs rt << 1 | 1
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
inline int readint() {int x; scanf("%d", &x); return x;}
struct node{
int val, lazy;
}tree[N << 2];
void push_up(int rt) {
tree[rt].val = tree[ls].val + tree[rs].val;
}
void push_down(int rt, int len) { //len代表当前区间的长度
if (tree[rt].lazy) {
tree[ls].val = (len - (len >> 1)) * tree[rt].lazy;
tree[rs].val = (len >> 1) * tree[rt].lazy;
tree[ls].lazy = tree[rt].lazy;
tree[rs].lazy = tree[rt].lazy;
tree[rt].lazy = 0;
}
}
void build(int l, int r, int rt) {
tree[rt].lazy = 0;
if (l == r) {
tree[rt].val = 1;
return;
}
int mid = l + r >> 1;
build(lson);
build(rson);
push_up(rt);
}
void update(int l, int r, int rt, int ul, int ur, int val) {
if (l >= ul && r <= ur) {
tree[rt].val = (r - l + 1) * val;
tree[rt].lazy = val;
return;
}
push_down(rt, r - l + 1);
int mid = l + r >> 1;
if (mid >= ul) update(lson, ul, ur, val);
if (mid + 1 <= ur) update(rson, ul, ur, val);
push_up(rt);
}
int query(int l, int r, int rt, int ql, int qr) {
if (l >= ql && r <= qr) {
return tree[rt].val;
}
push_down(rt, r - l + 1);
int mid = l + r >> 1;
int ans = 0;
if (mid >= ql) ans += query(lson, ql, qr);
if (mid + 1 <= qr) ans += query(rson, ql, qr);
return ans;
}
int main() {
#ifdef LOCAL
freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
#endif
int t = readint();
for(int ca = 1; ca <= t; ++ca) {
int n = readint(), q = readint();
build(1, n, 1);
while (q--) {
int l, r, val;
scanf("%d%d%d", &l, &r, &val);
update(1, n, 1, l, r, val);
}
printf("Case %d: The total value of the hook is %d.\n", ca, tree[1].val);
}
return 0;
}