Just a Hook hdu1698 [线段树区间更新]

这是一道比较明显的线段树区间更新,但是写起来还是有点麻烦~
直接上模板
【Just a Hook hdu1698 [线段树区间更新]】相关链接:
just a hook




#include #include #include #include using namespace std; #define N 100005 int s[N<<2]; int a[N<<2]; void pushup(int rt)//向上更新 { s[rt]=s[rt<<1]+s[rt<<1|1]; } void down(int rt,int p)//向下更新 { if(a[rt]) { a[rt<<1]=a[rt]; a[rt<<1|1]=a[rt]; s[rt<<1]=a[rt]*(p-p/2); s[rt<<1|1]=a[rt]*(p/2); a[rt]=0; } } void build(int l,int r,int rt) { a[rt]=0; if(l==r) s[rt]=1; else { int m=(l+r)/2; build(l,m,rt<<1); build(m+1,r,rt<<1|1); pushup(rt); } } void updata(int left,int right,int l,int r,int rt,int p) { if(left<=l&&right>=r) { a[rt]=p; s[rt]=a[rt]*(r-l+1); return ; } else { down(rt,r-l+1); int m=(l+r)/2; if(left<=m) updata(left,right,l,m,rt<<1,p); if(right>m) updata(left,right,m+1,r,rt<<1|1,p); pushup(rt); } } int query(int left,int right,int l,int r,int rt) { if(left<=l&&right>=r) { return s[rt]; } down(rt,r-l+1); int ans=0; int m=(l+r)/2; if(left<=m) ans+=query(left,right,l,m,rt<<1); if(right>m) ans+=query(left,right,m+1,r,rt<<1|1); return ans; } int main() { intt,x,y,z,n,k,p=1; scanf("%d",&t); while(t--) { int ans=0; scanf("%d%d",&n,&k); build(1,n,1); for(int i=0; i



    推荐阅读