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
}
}
#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
}
}
相关文章推荐
- HDU 1698 Just a Hook(线段树:区间set,区间查询)
- HDU 1698 Just a Hook(线段树:区间set,区间查询)
- HDU 1698-Just a Hook(线段树_区间更新+lazy标记)
- HDU 1698 Just A Hook(线段树修改区间到某值)
- hdu - 1698 - Just a Hook(线段树(区间更新))
- HDU 1698 Just a Hook 线段树区间更新求和
- HDU 1698 Just a Hook (线段树区间更新)
- HDU 1698 Just a Hook(线段树/区间更新)
- HDU 1698 Just a Hook 线段树区间更新(值进行覆盖)
- HDU 1698 Just a Hook // 线段树 区间更新
- hdu 1698 Just a Hook(线段树区间覆盖)
- HDU 1698 Just a Hook 线段树区间更新
- hdu1698 Just a Hook (线段树区间更新 懒惰标记)
- hdu 1698 Just a Hook(线段树区间更新求和)
- HDU 1698 Just a Hook【线段树】区间修改,查询总和
- HDU 1698 Just a Hook 线段树区间改值
- HDU 1698 Just a Hook 线段树区间更新(值进行覆盖)
- HDU 1698 JUST a hook (线段树 成段替换 区间求和 延迟标记)
- hdu 1698 Just a Hook(线段树求总区间和)
- hdu 1698:Just a Hook(线段树,区间更新)