您的位置:首页 > 其它

hdu 1698 线段树 成段更新

2015-04-20 17:54 253 查看
题意:一段钩子,每个钩子的值为1,有若干更新,每次跟新某段的值,若干查询某段的和

基础题了

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
using namespace std;
#define MOD 1000000007
const int INF=0x3f3f3f3f;
const double eps=1e-5;
#define cl(a) memset(a,0,sizeof(a))
#define ts printf("*****\n");
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define root 1,n,1
#define mid ((l+r)>>1)
const int MAXN=111111;
int n,m,t,Min;
int sum[MAXN<<2],col[MAXN<<2];
void pushup(int rt){
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void pushdown(int rt,int m)
{
if(col[rt]!=0)
{
sum[rt<<1]=(m-(m>>1))*col[rt];  //位运算一定要带括号
sum[rt<<1|1]=(m>>1)*col[rt];
col[rt<<1]=col[rt<<1|1]=col[rt];
col[rt]=0;
}
}
void build(int l,int r,int rt){
col[rt]=0;
sum[rt]=1;
if(l==r)    return;
build(lson);
build(rson);
pushup(rt);
}
void update(int L,int R,int val,int l,int r,int rt)
{
if(l>=L&&r<=R)
{
col[rt]=val;
sum[rt]=(r-l+1)*val;
return;
}
if(L>r||R<l)
return ;
pushdown(rt,r-l+1);
update(L,R,val,lson);
update(L,R,val,rson);
pushup(rt);
}
int main()
{
int i,j,k;
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
#endif
int l,t,o,a,b,c,tt;
scanf("%d",&tt);
for(int cas=1;cas<=tt;cas++)
{
scanf("%d%d",&n,&m);
build(root);
while(m--)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
update(a,b,c,root);
}
printf("Case %d: The total value of the hook is %d.\n",cas,sum[1]);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: