E
来源:互联网 发布:全国淘宝店铺有多少个 编辑:程序博客网 时间:2024/05/01 03:59
Think:
1知识点:线段树区间更新+lazy标记
2题意:在n个初始化点权为1的点的基础上进行区间更新,询问最终状态n个点的点权之和
3反思:当前题目lazy标记赋值更新
vjudge题目链接
以下为Wrong Answer代码——lazy标记更新错误
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 101400;struct Node{ int sum;}node[N<<2];int lazy[N<<2];void Build(int l, int r, int rt);void Updata(int rt);void down(int rt, int l, int r);void up_v(int L, int R, int v, int l, int r, int rt);int main(){ int T, k = 1, n, m, L, R, v; scanf("%d", &T); while(T--){ scanf("%d", &n); Build(1, n, 1); scanf("%d", &m); while(m--){ scanf("%d %d %d", &L, &R, &v); up_v(L, R, v, 1, n, 1); } printf("Case %d: The total value of the hook is %d.\n", k++, node[1].sum); } return 0;}void Build(int l, int r, int rt){ lazy[rt] = 0; if(l == r){ node[rt].sum = 1; return; } int mid = (l+r)/2; Build(l, mid, rt<<1); Build(mid+1, r, rt<<1|1); Updata(rt);}void Updata(int rt){ node[rt].sum = node[rt<<1].sum + node[rt<<1|1].sum;}void up_v(int L, int R, int v, int l, int r, int rt){ if(L <= l && r <= R){ node[rt].sum = v*(r-l+1); lazy[rt] = v; return; } down(rt, l, r); int mid = (l+r)/2; if(L <= mid) up_v(L, R, v, l, mid, rt<<1); if(R > mid) up_v(L, R, v, mid+1, r, rt<<1|1); Updata(rt);}void down(int rt, int l, int r){ if(lazy[rt]){ lazy[rt<<1] += lazy[rt]; lazy[rt<<1|1] += lazy[rt]; int mid = (l+r)/2; node[rt<<1].sum = lazy[rt]*(mid-l+1); node[rt<<1|1].sum = lazy[rt]*(r-mid); lazy[rt] = 0; }}
以下为Accepted代码
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 101400;struct Node{ int sum;}node[N<<2];int lazy[N<<2];void Build(int l, int r, int rt);void Updata(int rt);void down(int rt, int l, int r);void up_v(int L, int R, int v, int l, int r, int rt);int main(){ int T, k = 1, n, m, L, R, v; scanf("%d", &T); while(T--){ scanf("%d", &n); Build(1, n, 1); scanf("%d", &m); while(m--){ scanf("%d %d %d", &L, &R, &v); up_v(L, R, v, 1, n, 1); } printf("Case %d: The total value of the hook is %d.\n", k++, node[1].sum); } return 0;}void Build(int l, int r, int rt){ lazy[rt] = 0; if(l == r){ node[rt].sum = 1; return; } int mid = (l+r)/2; Build(l, mid, rt<<1); Build(mid+1, r, rt<<1|1); Updata(rt);}void Updata(int rt){ node[rt].sum = node[rt<<1].sum + node[rt<<1|1].sum;}void up_v(int L, int R, int v, int l, int r, int rt){ if(L <= l && r <= R){ node[rt].sum = v*(r-l+1); lazy[rt] = v; return; } down(rt, l, r); int mid = (l+r)/2; if(L <= mid) up_v(L, R, v, l, mid, rt<<1); if(R > mid) up_v(L, R, v, mid+1, r, rt<<1|1); Updata(rt);}void down(int rt, int l, int r){ if(lazy[rt]){ lazy[rt<<1] = lazy[rt];/*lazy标记赋值更新*/ lazy[rt<<1|1] = lazy[rt];/*lazy标记赋值更新*/ int mid = (l+r)/2; node[rt<<1].sum = lazy[rt]*(mid-l+1); node[rt<<1|1].sum = lazy[rt]*(r-mid); lazy[rt] = 0; }}