`
xuela_net
  • 浏览: 495329 次
文章分类
社区版块
存档分类
最新评论

hdu 1698 线段树成段更新

 
阅读更多

这么重要的数据结构还是得学啊。仿notonlysuccess的代码风格

#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;

#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
const int maxn = 100001;
int h , w , n;
int col[maxn<<2];
int sum[maxn<<2];
void PushUp(int rt) {
    sum[rt] = sum[rt<<1] + sum[rt<<1|1];
}
void PushDown(int rt,int m) {
    if (col[rt]) {
        col[rt<<1]=col[rt<<1|1]=col[rt];
        sum[rt<<1]=(m-(m>>1))*col[rt];
        sum[rt<<1|1]=(m>>1)*col[rt];
        col[rt]=0;
    }
}
void build(int l,int r,int rt) {
    col[rt] = 0;
    sum[rt] = 1;
    if (l == r) return ;
    int m = (l + r) >> 1;
    build(lson);
    build(rson);
    PushUp(rt);
}
void update(int L,int R,int c,int l,int r,int rt) {
    if (L <= l && r <= R) {
        col[rt] = c;
        sum[rt] = c * (r - l + 1);
        return ;
    }
    PushDown(rt , r - l + 1);
    int m = (l + r) >> 1;
    if (L <= m) update(L , R , c , lson);
    if (R > m) update(L , R , c , rson);
    PushUp(rt);
}
int query(int L,int R,int l,int r,int rt) {
	if (L <= l && r <= R) {
		return sum[rt];
	}
	int m = (l + r) >> 1;
	int ret = 0;
	if (L <= m) ret += query(L , R , lson);
	if (R > m) ret += query(L , R , rson);
	return ret;
}
int main()
{
    int cas,n,t,a,b,c;
    cin>>cas;
    for(int i=1;i<=cas;i++)
    {
        scanf("%d",&n);
        build(1,n,1);
        scanf("%d",&t);
        while(t--)
        {
            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",i,sum[1]/*query(1,n,1,n,1)*/);
    }
    return 0;
}


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics