hdu 4578 線段樹模板
阿新 • • 發佈:2019-02-04
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; }