标签:algo contains ted date fine dota cup nta 线段树
Sample Input 1 10 2 1 5 2 5 9 3 Sample Output Case 1: The total value of the hook is 24.
题意:
输入T,表示T组样例,输入n,表示有n个节点,最初所有点的值为1,然后给定X、Y、Z,将从X到Y改为权值为Z,计算权值和。
思路:
线段树区间更新的模板。
代码:
#include <cstdio> #include <string> #include <algorithm> #include <iostream> using namespace std; struct node { int l,r; int w; }tree[300005]; void build(int l,int r,int n) { tree[n].l = l; tree[n].r = r; tree[n].w = 1; if(l == r) return ; int temp = (l+r)/2; build(l,temp,2*n); build(temp+1,r,2*n+1); } void update(int l,int r,int w,int n) { if(tree[n].l == l&&tree[n].r == r) { tree[n].w = w; return; } if(tree[n].w!=-1)//将值更改为-1,代表这个区间内的值都已经更改 { tree[2*n].w = tree[2*n+1].w = tree[n].w; tree[n].w = -1; } int temp=(tree[n].l+tree[n].r)/2; if(r <= temp) update(l,r,w,2*n); else if(l>temp) update(l,r,w,2*n+1); else { update(l,temp,w,2*n); update(temp+1,r,w,2*n+1); } } int find(int n)//查找 { if(tree[n].w != -1)//如果节点不为-1,表示这个区间内的值都是tree[n].w { return (tree[n].r-tree[n].l+1)*tree[n].w; } else//如果节点为-1,递归下去。 { return find(2*n)+find(2*n+1); } } int main() { int T; scanf("%d",&T); for(int i=1; i<=T; i++) { int n; scanf("%d",&n); build(1,n,1); int p; scanf("%d",&p); while(p--) { int a,b,w; scanf("%d%d%d",&a,&b,&w); update(a,b,w,1); } printf("Case %d: ",i); printf("The total value of the hook is %d.\n",find(1)); } }
标签:algo contains ted date fine dota cup nta 线段树
原文地址:http://www.cnblogs.com/aiguona/p/7544935.html