BZOJ P1798:[Ahoi2009]Seq 维护序列seq

来源:互联网 发布:优酷总是网络连接失败 编辑:程序博客网 时间:2024/06/11 01:04

正确率刷到了46%

真是蛋疼

这不是一道线段树的模板题吗

把(x+add)*val化开,变成x*val+add*val

然后直接处理就可以了

下面是代码,cin/out RE,改成printf,scanf就AC了

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#define maxn 100010#define lc id<<1#define rc id<<1|1using namespace std;typedef long long ll;int n,opt,a[maxn];ll m;struct Node{    int l,r;    ll s,m,a;}t[maxn<<3];void pushdown(int id){    int l=t[id].l,r=t[id].r,mid=l+r>>1;    t[lc].s=(t[lc].s*t[id].m+t[id].a*(mid-l+1))%m;    t[rc].s=(t[rc].s*t[id].m+t[id].a*(r-mid))%m;    t[lc].m=t[lc].m*t[id].m%m;    t[rc].m=t[rc].m*t[id].m%m;    t[lc].a=(t[lc].a*t[id].m+t[id].a)%m;    t[rc].a=(t[rc].a*t[id].m+t[id].a)%m;    t[id].m=1,t[id].a=0;}void pushup(int id){t[id].s=(t[lc].s+t[rc].s)%m;}void build(int id,int l,int r){    t[id].l=l,t[id].r=r;t[id].m=1,t[id].a=0;    if(l==r){        t[id].s=a[l]%m;        return;    }    int mid=l+r>>1;    build(lc,l,mid);build(rc,mid+1,r);    pushup(id);}ll ask(int id,int l,int r){    pushdown(id);    if(t[id].l==l&&t[id].r==r){    return t[id].s;}    int mid=t[id].l+t[id].r>>1;    if(r<=mid){    return ask(lc,l,r);}    if(l>mid){    return ask(rc,l,r);}    return(ask(lc,l,mid)+ask(rc,mid+1,r))%m;}void Mul(int id,int l,int r,int c){    pushdown(id);    if(t[id].l==l&&t[id].r==r){        t[id].m=t[id].m*c%m;        t[id].s=t[id].s*c%m;        return;    }    int mid=t[id].l+t[id].r>>1;    if(r<=mid){    Mul(lc,l,r,c);}    else if(l>mid){    Mul(rc,l,r,c);}else{        Mul(lc,l,mid,c);Mul(rc,mid+1,r,c);    }    pushup(id);}void Plus(int id,int l,int r,int c){    pushdown(id);    if(t[id].l==l&&t[id].r==r){        t[id].a+=c;t[id].a%=m;        t[id].s+=1ll*(r-l+1)*c;t[id].s%=m;        return;    }    int mid=t[id].l+t[id].r>>1;    if(r<=mid){    Plus(lc,l,r,c);}else if(l>mid){Plus(rc,l,r,c);}else{        Plus(lc,l,mid,c);        Plus(rc,mid+1,r,c);    }    pushup(id);}int main(){    scanf("%d%lld",&n,&m);    for(int i=1;i<=n;i++){    cin>>a[i];}    build(1,1,n);    scanf("%d",&opt);    int type,l,r,c;    for(int i=1;i<=opt;i++){        scanf("%d",&type);        if(type==3){            scanf("%d%d",&l,&r);            printf("%lld\n",ask(1,l,r)%m);            continue;        }        scanf("%d%d%d",&l,&r,&c);        if(type==1){        Mul(1,l,r,c);}else{Plus(1,l,r,c);}    }return 0;}/*in:7 431 2 3 4 5 6 751 2 5 53 2 42 3 7 93 1 33 4 7Sample Output2358*/


1 0
原创粉丝点击