UESTC

来源:互联网 发布:淘宝网毛衣女装张大奕 编辑:程序博客网 时间:2024/06/07 06:55
/*思路:这个题目主要是用两个延迟标记的数组,一个加一个乘来处理。但是我们的问题是,当两个延迟标记到了 一个区间的时候我们是先加还是乘呢。如果弄清楚这个原理,这个题目,就出来了。大家看下这个啥 忘记叫啥了(sum[rt]+3)*2 ==sum*2+3*2,我们假设+3就是线段树加的延迟标记。乘2就是线段树的乘的延迟标记。我们遇到乘,就直接也同样的更新加的延迟标记,因为加如果没有的话,乘就是1,加就是0,当加来的时候我们每次都默认先乘,当有加的时候乘的就是1所以不变,当只有成的时候加的就是0, sum*a+3*b 当a等于1b等于0的时候,我们执行这个结果是不会改变的。当有乘延迟来的时候 就得将之前的 加的延迟标记  也得乘上这个数,就相当于哪里 +3 也得乘二,就是( sum[rt]+3)*2 ==sum*2+3*2 这样子 */ #include<stdio.h>#include<string.h>#include<stdlib.h> #define mem(a,b) memsesum(a,b,sizeof(a))using namespace std;#define N 100000*4+10typedef long long ll;ll ssss;ll n,p,m;ll sum[N];//求和数组 ll add[N];//延迟标记加 ll add1[N];//乘 void PushUp(int rt)//更新 {     sum[rt]=(sum[rt*2]+sum[rt*2+1])%p;}void build(ll l,ll r,ll rsum)//建立线段树 {    add1[rsum]=1,add[rsum]=0;    if(l==r)    {        scanf("%lld",&sum[rsum]);        return;    }    ll m=(l+r)>>1;    build(l,m,rsum<<1);    build(m+1,r,rsum<<1|1);    PushUp(rsum);}void pushdown(ll rsum,ll num){    add[rsum<<1]=(add[rsum<<1]*add1[rsum]+add[rsum])%p;    add[rsum<<1|1]=(add[rsum<<1|1]*add1[rsum]+add[rsum])%p;    add1[rsum<<1]=(add1[rsum<<1]*add1[rsum])%p;    add1[rsum<<1|1]=(add1[rsum<<1|1]*add1[rsum])%p;    sum[rsum<<1]=(sum[rsum<<1]*add1[rsum]+(num-num/2)*add[rsum])%p;    sum[rsum<<1|1]=(sum[rsum<<1|1]*add1[rsum]+(num/2)*add[rsum])%p;    add[rsum]=0;    add1[rsum]=1;}void updasuma(ll rsum,ll l,ll r,ll x,ll y,ll val,ll op){    if(x<=l&&r<=y)    {        if(op==1)        {            add[rsum]=(add[rsum]*val)%p;            add1[rsum]=(add1[rsum]*val)%p;            sum[rsum]=(sum[rsum]*val)%p;        }        else        {            add[rsum]=(add[rsum]+val);            sum[rsum]=(sum[rsum]+(r-l+1)*val)%p;        }        return;    }    pushdown(rsum,r-l+1);    ll m=(l+r)>>1;    if(x<=m)        updasuma(rsum<<1,l,m,x,y,val,op);    if(y>m)        updasuma(rsum<<1|1,m+1,r,x,y,val,op);    PushUp(rsum);}void query(ll x,ll y,ll l,ll r,ll rsum){    if(x<=l&&y>=r)      {         ssss=(ssss%p+sum[rsum]%p)%p;         return ;      }    pushdown(rsum,r-l+1);    ll m=(l+r)>>1;    if(x<=m)        query(x,y,l,m,rsum<<1);     if(y>m)      query(x,y,m+1,r,rsum<<1|1);}int main(){    scanf("%lld%lld",&n,&p);    build(1,n,1);    scanf("%lld",&m);    ll x,y,val,op;    for(ll i=0;i<m;i++)    {        scanf("%lld",&op);        if(op==1)        {            scanf("%lld%lld%lld",&x,&y,&val);           updasuma(1,1,n,x,y,val,1);        }        else if(op==2)        {            scanf("%lld%lld%lld",&x,&y,&val);          updasuma(1,1,n,x,y,val,2);        }        else        {            scanf("%lld%lld",&x,&y);                ssss=0;            query(x,y,1,n,1);            printf("%lld\n",ssss);        }    }}

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小米金融还款中怎么办 股票遇到闪崩怎么办 微信插件没有怎么办 excel打印太小怎么办 工地临时人员死亡怎么办 哺乳期乳腺增生疼怎么办 哺乳期有乳腺增生怎么办 哺乳期得了乳腺增生怎么办 中等教育认证花名册丢失怎么办 哺乳期囊性结节怎么办 乳腺增生堵奶怎么办 月子期乳房增生怎么办 母乳期乳腺增生怎么办 上市公司破产了股票怎么办 iptv错误码30022怎么办 电信iptv不清晰怎么办 电信iptv卡顿怎么办 pr滚动字幕闪烁怎么办 电视车表盘看不清怎么办 图片字看不清楚怎么办 字太潦草看不清怎么办 微信图片看不清怎么办 小车上坡没动力怎么办 上海牌照拍到了怎么办 杭州车牌摇不到怎么办 孩子不上进家长怎么办 孩子读书蠢以后怎么办 上海银行储蓄卡怎么办 分数不够读高中怎么办 iso11.4耗电快怎么办 支票存根联丢失怎么办 注册公司没有办公室怎么办 收款条一方有怎么办 员工收款跑了怎么办 社保转外地医保怎么办 异地辞职后医保怎么办 公司交深圳保险怎么办 异地办社保医保怎么办 个人异地交社保怎么办 终止挂牌股民钱怎么办 终止挂牌后股票怎么办