HDU - 4578 -Transformation(线段树)
2016-11-25 22:36
369 查看
有地方写残了一直wa
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <cmath> using namespace std; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define ll long long const int maxn=100010; const int mod=10007; ll sum1[maxn<<2],sum2[maxn<<2],sum3[maxn<<2]; int lazyp[maxn<<2],lazym[maxn<<2],flag[maxn<<1]; void pushup(int rt) { sum1[rt]=(sum1[rt<<1]+sum1[rt<<1|1])%mod; sum2[rt]=(sum2[rt<<1]+sum2[rt<<1|1])%mod; sum3[rt]=(sum3[rt<<1]+sum3[rt<<1|1])%mod; } void pushdown(int rt,int m) { if(flag[rt]!=0) { flag[rt<<1]=flag[rt<<1|1]=flag[rt]; sum1[rt<<1]=(m-(m>>1))*flag[rt]; sum1[rt<<1|1]=(m>>1)*flag[rt]; sum2[rt<<1]=(m-(m>>1))*flag[rt]*flag[rt]; sum2[rt<<1|1]=(m>>1)*flag[rt]*flag[rt]; sum3[rt<<1]=(m-(m>>1))*flag[rt]*flag[rt]*flag[rt]; sum3[rt<<1|1]=(m>>1)*flag[rt]*flag[rt]*flag[rt]; lazym[rt<<1|1]=lazym[rt<<1]=lazym[rt]=1; lazyp[rt<<1|1]=lazyp[rt<<1]=lazyp[rt]=0; flag[rt]=0; } if(lazym[rt]!=1||lazyp[rt]!=0) { //cout<<rt<<endl; lazyp[rt<<1]*=lazym[rt]; lazyp[rt<<1|1]*=lazym[rt]; lazyp[rt<<1]+=lazyp[rt]; lazyp[rt<<1|1]+=lazyp[rt]; lazyp[rt<<1]=lazyp[rt<<1]%mod; lazyp[rt<<1|1]=lazyp[rt<<1|1]%mod; lazym[rt<<1]*=lazym[rt]; lazym[rt<<1|1]*=lazym[rt]; lazym[rt<<1]=lazym[rt<<1]%mod; lazym[rt<<1|1]=lazym[rt<<1|1]%mod; sum3[rt<<1]=lazym[rt]*lazym[rt]%mod*lazym[rt]%mod*sum3[rt<<1]%mod; sum3[rt<<1]=(sum3[rt<<1]+3*lazym[rt]%mod*lazym[rt]%mod*lazyp[rt]%mod*sum2[rt<<1]%mod)%mod; sum3[rt<<1]=(sum3[rt<<1]+3*lazym[rt]%mod*lazyp[rt]%mod*lazyp[rt]%mod*sum1[rt<<1]%mod)%mod; sum3[rt<<1]=(sum3[rt<<1]+(m-(m>>1))*lazyp[rt]%mod*lazyp[rt]%mod*lazyp[rt]%mod)%mod; sum2[rt<<1]=((lazym[rt]*lazym[rt])%mod*sum2[rt<<1]%mod+2*lazyp[rt]*lazym[rt]%mod*sum1[rt<<1]%mod+(m-(m>>1))*lazyp[rt]%mod*lazyp[rt]%mod)%mod; sum1[rt<<1]=((sum1[rt<<1]*lazym[rt])%mod+(((m-(m>>1))*lazyp[rt])%mod))%mod; sum3[rt<<1|1]=lazym[rt]*lazym[rt]%mod*lazym[rt]%mod*sum3[rt<<1|1]%mod; sum3[rt<<1|1]=(sum3[rt<<1|1]+3*lazym[rt]%mod*lazym[rt]%mod*lazyp[rt]%mod*sum2[rt<<1|1]%mod)%mod; sum3[rt<<1|1]=(sum3[rt<<1|1]+3*lazym[rt]%mod*lazyp[rt]%mod*lazyp[rt]%mod*sum1[rt<<1|1]%mod)%mod; sum3[rt<<1|1]=(sum3[rt<<1|1]+(m>>1)*lazyp[rt]%mod*lazyp[rt]%mod*lazyp[rt]%mod)%mod; sum2[rt<<1|1]=(((lazym[rt]*lazym[rt])%mod)*(sum2[rt<<1|1]%mod)+((2*lazyp[rt]*lazym[rt])%mod)*(sum1[rt<<1|1]%mod)+(((m>>1)*lazyp[rt])%mod)*(lazyp[rt]%mod))%mod; sum1[rt<<1|1]=((sum1[rt<<1|1]*lazym[rt])%mod+(((m>>1)*lazyp[rt])%mod))%mod; lazyp[rt]=0; lazym[rt]=1; } } void build(int l,int r,int rt) { sum1[rt]=sum2[rt]=sum3[rt]=0; flag[rt]=0;lazym[rt]=1;lazyp[rt]=0; if(l==r) { flag[rt]=0;lazym[rt]=1;lazyp[rt]=0; sum1[rt]=sum2[rt]=sum3[rt]=0; return ; } int m=(l+r)>>1; build(lson); build(rson); } void change(int c,int L,int R,int l,int r,int rt) { if(L<=l&&R>=r) { sum1[rt]=(c*(r-l+1))%mod;sum2[rt]=(c*c*(r-l+1))%mod; sum3[rt]=(c*c*c*(r-l+1))%mod; flag[rt]=c; lazym[rt]=1,lazyp[rt]=0; return; } pushdown(rt,r-l+1); int m=(l+r)>>1; if(L<=m)change(c,L,R,lson); if(R>m)change(c,L,R,rson); pushup(rt); } void update(int type,int c,int L,int R,int l,int r,int rt) { //cout<<(c*c*c)%mod<<" "<<(c*(c*c)%mod)%mod<<endl; if(L<=l&&R>=r) { c%=mod; if(type==1) { lazyp[rt]+=c; lazyp[rt]%=mod; sum3[rt]+=(((c*(c*c)%mod)%mod*(r-l+1))%mod+(3*sum2[rt]*c)%mod+(3*((c*c)%mod)*sum1[rt])%mod)%mod; sum3[rt]%=mod; sum2[rt]+=(((c*c)%mod*(r-l+1))%mod+(sum1[rt]*2*c)%mod)%mod; sum2[rt]%=mod; sum1[rt]+=(r-l+1)*c; sum1[rt]%=mod; } else if(type==2) { lazyp[rt]=(lazyp[rt]*c)%mod; lazym[rt]=(lazym[rt]*c)%mod; sum1[rt]=(sum1[rt]*c)%mod; sum2[rt]=(sum2[rt]*((c*c)%mod))%mod; sum3[rt]=(((sum3[rt]*c)%mod)*((c*c)%mod))%mod; } return ; } int m=(l+r)>>1; pushdown(rt,r-l+1); if(L<=m)update(type,c,L,R,lson); if(R>m)update(type,c,L,R,rson); pushup(rt); } int query(int p,int L,int R,int l,int r,int rt) { if(L<=l&&R>=r) { if(p==1)return sum1[rt]; else if(p==2)return sum2[rt]; else if(p==3)return sum3[rt]; } int m=(l+r)>>1,ans=0; pushdown(rt,r-l+1); if(L<=m)ans+=query(p,L,R,lson); if(R>m)ans+=query(p,L,R,rson); ans%=mod; return ans; } int main() { int n,m,a,b,c,d; int cas=0; while(~scanf("%d%d",&n,&m)&&n+m) { build(1,n,1); for(int i=0;i<m;i++) { scanf("%d%d%d%d",&a,&b,&c,&d); if(a==1) { update(1,d,b,c,1,n,1); } else if(a==2) { update(2,d,b,c,1,n,1); } else if(a==3) { change(d,b,c,1,n,1); } else if(a==4) { int ans=query(d,b,c,1,n,1); printf("%d\n",ans); } } } return 0; }
相关文章推荐
- hdu 4578 Transformation(线段树+多种操作)
- HDU 4578 Transformation (线段树)
- hdu 4578 Transformation(线段树+多种操作)
- Transformation - HDU 4578 - 线段树
- hdu 4578 Transformation(线段树+多种操作)
- HDU 4578 Transformation(13年杭州邀请赛-C题-线段树)
- hdu 4578 Transformation(线段树)
- hdu 4578 Transformation 线段树
- hdu 4578 Transformation(线段树+多种操作)
- hdu 4578 Transformation(线段树)
- 【线段树多符号区间更新】HDU - 4578 Transformation
- hdu 4578 Transformation(线段树+多种操作)
- HDU 4578 Transformation --线段树,好题
- hdu 4578 Transformation(线段树+多种操作)
- hdu 4578 Transformation(线段树区间操作)
- hdu-4578 Transformation 线段树成段更新
- hdu 4578 Transformation(线段树+多种操作)
- hdu 4578 Transformation 线段树
- HDU4578——Transformation(线段树)
- hdu 4578 Transformation(线段树区间更新)