您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: