您的位置:首页 > 其它

HDU 1698 Just a Hook(线段树:区间set,整体区间sum)

2018-03-08 21:35 411 查看
题意:题解:      线段树模板题:区间add,区间sum。这里没必要写query函数了,让求全体sum,所以这道题不用线段树也是可以滴~~~暴力呗。既然在线段树专题训练了,就老实线段树~!  #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<string>
#include<cstring>
#include<vector>
#include<functional>
#include<utility>
#include<set>
#include<map>
#include<cmath>
#include<cctype>
#define INF 0x3f3f3f3f

using namespace std;

const int maxn=100000+10;
#define lson 2*i,l,m
#define rson 2*i+1,m+1,r

int setv[maxn<<2],sum[maxn<<2];

void pushup(int i)
{
sum[i]=sum[2*i]+sum[2*i+1];
}

void build(int i,int l,int r)
{
setv[i]=0;
if(l==r){sum[i]=1;return;}

int m=(l+r)/2;
build(lson);
build(rson);
pushup(i);
}

void pushdown(int i,int num)
{
if(setv[i])
{
setv[2*i]=setv[2*i+1]=setv[i];
sum[2*i+1]=(num/2)*setv[i];
sum[2*i]=(num-num/2)*setv[i];
setv[i]=0;
}
}
void update(int ql, int qr, int v, int i, int l, int r)
{
if(ql<=l&&qr>=r)
{
setv[i]=v;
sum[i]=v*(r-l+1);
return;
}

pushdown(i,r-l+1);
int m=(l+r)/2;
if(ql<=m)update(ql,qr,v,lson);
if(qr>m)update(ql,qr,v,rson);
pushup(i);
}

int query(int ql,int qr,int i,int l,int r)
{
if(ql<=l&&qr>=r)
{
return sum[i];
}

pushdown(i,r-l+1);

int m=(l+r)/2;
int res=0;
if(ql<=m)res+=query(ql,qr,lson);
if(qr<m)res+=query(ql,qr,rson);
return res;
}

int main()
{
int t;cin>>t;
for(int kase=1;kase<=t;kase++)
{
int n,q;
cin>>n>>q;

build(1,1,n);
while(q--)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
update(x,y,z,1,1,n);
}
printf("Case %d: The total value of the hook is %d.\n",kase,sum[1]);//无需query
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: