hdu 4578 线段树模板
2015-02-25 11:19
337 查看
lazy不为-1表示统一段为一个值
#include<iostream> #include<algorithm> #include<iostream> #include<stdio.h> #include<string.h> #include<stdlib.h> #include<vector> #include<queue> #include<cmath> using namespace std; #define ll __int64 #define inf 0x3f3f3f3f #define maxNode 100010 #define mod 10007 int dir[4][2]={0,1,0,-1,1,0,-1,0}; struct node { int l,r,lazy; int sum1,sum2,sum3; int mid(){return (l+r)>>1;} }tree[4*maxNode]; void build(int id,int x,int y) { tree[id].l=x; tree[id].r=y; tree[id].lazy=tree[id].sum1=tree[id].sum2=tree[id].sum3=0; if(x==y)return ; int mid=(x+y)>>1; build(id<<1,x,mid); build(id<<1|1,mid+1,y); } void pushdown(int id) { tree[id<<1].lazy=tree[id<<1|1].lazy=tree[id].lazy; int te=tree[id].lazy; int mid=tree[id].mid(); int x=tree[id].l; int y=tree[id].r; tree[id<<1].sum1=te*(mid-x+1)%mod; tree[id<<1].sum2=te*te%mod*(mid-x+1)%mod; tree[id<<1].sum3=te*te%mod*te%mod*(mid-x+1)%mod; tree[id<<1|1].sum1=te*(y-mid)%mod; tree[id<<1|1].sum2=te*te%mod*(y-mid)%mod; tree[id<<1|1].sum3=te*te%mod*te%mod*(y-mid)%mod; } void pushup(int id) { if(tree[id<<1].lazy==tree[id<<1|1].lazy) tree[id].lazy=tree[id<<1].lazy; else tree[id].lazy=-1; tree[id].sum1=(tree[id<<1].sum1+tree[id<<1|1].sum1)%mod; tree[id].sum2=(tree[id<<1].sum2+tree[id<<1|1].sum2)%mod; tree[id].sum3=(tree[id<<1].sum3+tree[id<<1|1].sum3)%mod; } void change(int id,int x,int y,int z,int kind) { if(tree[id].l==x && tree[id].r==y && tree[id].lazy!=-1) { int te; if(kind==1) te=(tree[id].lazy+z)%mod; else if(kind==2) te=(tree[id].lazy*z)%mod; else if(kind==3) te=z; tree[id].lazy=te; tree[id].sum1=te*(y-x+1)%mod; tree[id].sum2=te*te%mod*(y-x+1)%mod; tree[id].sum3=te*te%mod*te%mod*(y-x+1)%mod; return ; } if(tree[id].lazy!=-1) pushdown(id); int mid=tree[id].mid(); if(y<=mid) change(id<<1,x,y,z,kind); else if(mid+1<=x) change(id<<1|1,x,y,z,kind); else { change(id<<1,x,mid,z,kind); change(id<<1|1,mid+1,y,z,kind); } pushup(id); } int query(int id,int x,int y,int kind) { if(tree[id].l==x && tree[id].r==y) { if(kind==1) return tree[id].sum1; else if(kind==2) return tree[id].sum2; else return tree[id].sum3; } if(tree[id].lazy!=-1) pushdown(id); int mid=tree[id].mid(); if(y<=mid) return query(id<<1,x,y,kind); else if(x>=mid+1) return query(id<<1|1,x,y,kind); else return (query(id<<1,x,mid,kind)+query(id<<1|1,mid+1,y,kind))%mod; } int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF && n!=0) { int i,j,k; int ta,tb,tc,td; build(1,1,n); while(m--) { scanf("%d%d%d%d",&ta,&tb,&tc,&td); if(ta==4) printf("%d\n",query(1,tb,tc,td)); else change(1,tb,tc,td,ta); } } return 0; }
相关文章推荐
- HDU 1754 I Hate It (线段树模板题)
- hdu 3074 Multiply game(模板级线段树)
- HDU 1556 线段树 模板题
- hdu 4578 Transformation(线段树)
- hdu 4578 Transformation(线段树)
- hdu_1754_线段树模板题
- hdu-4578-Transformation-线段树
- hdu 4578 Transformation 线段树
- HDU 4578 Transformation (线段树)
- HDU 1754 线段树模板
- hdu 1754 线段树模板题
- hdu 4578 区间线段树
- HDU 4578 Transformation (线段树)
- 线段树模板 hdu 敌兵布阵
- Hdu 4578 (线段树)
- hdu 3074 Multiply game(模板级线段树)
- hdu 1540 Tunnel Warfare (区间线段树(模板))
- hdu 4578 Transformation 线段树
- hdu 4578 Transformation(区间线段树)
- HDU 4578 线段树区间更新(确定区间操作的优先级)