标签:
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 27864 Accepted Submission(s): 13831
//不同的是不在原有的基础上增加,更新区间的数 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <stack> #include <queue> #define maxn 200007 #define INF 0x3f3f3f3f typedef long long LL; using namespace std; #define lson rt<<1 #define rson rt<<1|1 struct node { int l, r, s, e; } tree[maxn<<2]; void pushup(int rt) { tree[rt].s=tree[lson].s+tree[rson].s; } void build(int l, int r, int rt) { tree[rt].l=l; tree[rt].r=r; tree[rt].s=1;///将初始的节点和都赋值为1 tree[rt].e=0; if(l==r) return; int mid=(l+r)>>1; build(l, mid, lson); build(mid+1, r, rson); pushup(rt); } void pushdown(int rt, int m) { if(tree[rt].e) { tree[lson].e=tree[rt].e; tree[rson].e=tree[rt].e; tree[lson].s=tree[rt].e*(m-(m>>1)); tree[rson].s=tree[rt].e*(m>>1); tree[rt].e=0; } } void update(int l, int r, int c, int rt)///l,r表示操作区间,rt表示当前节点编号 { if(l<=tree[rt].l&&tree[rt].r<=r)///如果本区间完全在操作区间[L,R]以内 { tree[rt].e=c;///标记节点 tree[rt].s=c*(tree[rt].r-tree[rt].l+1);///更新数字和,向上保持正确 return; } pushdown(rt, tree[rt].r-tree[rt].l+1);///下推标记 int mid=(tree[rt].l+tree[rt].r)>>1; ///这里判断左右子树跟[L,R]有无交集,有交集才递归 if(l<=mid) update(l, r, c, lson); if(mid<r) update(l, r, c, rson); pushup(rt);///更新本节点信息 } int main() { int T, cas=1; scanf("%d", &T); while(T--) { int n, q; scanf("%d%d", &n, &q); build(1, n, 1); int a, b, c; for(int i=1; i<=q; i++) { scanf("%d%d%d", &a, &b, &c); update(a, b, c, 1); } printf("Case %d: The total value of the hook is %d.\n", cas++, tree[1].s); } return 0; }
标签:
原文地址:http://www.cnblogs.com/w-y-1/p/5738418.html