样例:
1(数据数)
10(1 个数初始都是 1)
2(2 次操作)
1 5 2(将[1, 5]区间内所有数变为 2)
5 9 3(将[5, 9]区间内所有数变为 3)
最后问[1, n]内所有元素的和。
线段树的区间更新。
#include<cstdio> #include<cstring> #include<cmath> #include<iostream> #include<algorithm> #include<vector> #include<map> #include<queue> #include<stack> #include<string> using namespace std; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 const int maxn = 1e5+10; int tree[maxn<<2], lazy[maxn<<2]; int n; void pushDown(int l, int r, int rt){ int m = l+(r-l)/2; tree[rt<<1] = (m-l+1)*lazy[rt]; tree[rt<<1 | 1] = (r-m)*lazy[rt]; lazy[rt<<1] = lazy[rt<<1|1] = lazy[rt]; lazy[rt] = 0; } void pushUp(int rt){ tree[rt] = tree[rt<<1] + tree[rt<<1|1];//区间和 } void build(int l, int r, int rt){ lazy[rt] = 0; //lazy初始化 if(l == r){ tree[rt] = 1; //线段树初始化 return; } int m = l+(r-l)/2; build(lson); build(rson); pushUp(rt); } //更新[L,R]内元素为val void update(int L, int R, int val, int l, int r, int rt){ if(L == l && R == r){ tree[rt] = val*(r-l+1); lazy[rt] = val; return; } //include l == r if(lazy[rt]) pushDown(l, r, rt); int m = l+(r-l)/2; if(R <= m) update(L, R, val, lson); else if(L > m) update(L, R, val, rson); else{ update(L, m, val, lson); update(m+1, R, val, rson); } pushUp(rt); } int main() { //freopen("a.txt", "r", stdin); int t; cin >> t; for(int cas = 1; cas <= t; cas++){ scanf("%d", &n); build(1, n, 1); int op; scanf("%d", &op); while(op--){ int a, b, c; scanf("%d%d%d", &a, &b, &c); update(a, b, c, 1, n, 1); } printf("Case %d: The total value of the hook is %d.\n", cas, tree[1]); } return 0; }