hdu-1698(线段树,区间修改)
Posted 2018zxy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu-1698(线段树,区间修改)相关的知识,希望对你有一定的参考价值。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1698
注意:用位运算会更快,不然超时。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn = 400400; int a[maxn],lazy[maxn]; void pushdown(int k,int l,int r) { if(lazy[k]) { lazy[k<<1]=lazy[k]; lazy[k<<1|1]=lazy[k]; int mid=(l+r)>>1; a[k<<1]=(mid-l+1)*lazy[k]; a[k<<1|1]=(r-mid)*lazy[k]; lazy[k]=0; } } void build(int k,int l,int r) { lazy[k]=0; if(l==r) { a[k]=1; return ; } int mid=(l+r)>>1; build(k<<1,l,mid); build(k<<1|1,mid+1,r); a[k]=a[k<<1]+a[k<<1|1]; } void update(int k,int l,int r,int x,int y,int v) { if(x<=l&&y>=r) { lazy[k]=v; a[k]=(r-l+1)*v; return ; } pushdown(k,l,r); int mid=(l+r)>>1; if(x<=mid) update(k<<1,l,mid,x,y,v); if(y>mid) update(k<<1|1,mid+1,r,x,y,v); a[k]=a[k<<1]+a[k<<1|1]; } int query(int k,int l,int r,int x,int y) { if(x<=l&&y>=r) return a[k]; pushdown(k,l,r); int mid=(l+r)>>1; int ans=0; if(x<=mid) ans+=query(k<<1,l,mid,x,y); if(y>mid) ans+=query(k<<1|1,mid+1,r,x,y); return ans; } int main(void) { int n,m,x,y,k,t,i,pt=1; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); build(1,1,n); for(i=0;i<m;i++) { scanf("%d%d%d",&x,&y,&k); update(1,1,n,x,y,k); } printf("Case %d: The total value of the hook is %d. ",pt++,query(1,1,n,1,n)); } return 0; }
以上是关于hdu-1698(线段树,区间修改)的主要内容,如果未能解决你的问题,请参考以下文章
HDU - 1698 Just a Hook(线段树区间整体修改值,查询区间和)
HDU - 1698 Just a Hook (线段树区间修改)