题目大意:维护一个序列,提供三种操作:

1.将区间中每个点的权值乘上一个数

2.将区间中每个点的权值加上一个数

3.求一段区间的和对p取模的值

2631的超^n级弱化版。写2631之前能够拿这个练练手。。。

线段树区间改动,让学校的大神指导了一下ZKW的区间改动方法,非常好理解,可是代码还是快不了。

回头再改改代码吧 可能是我写的太渣了

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 100100
using namespace std;
typedef long long ll;
struct abcd{
ll sum,siz,add_mark,times_mark;
void add(ll x);
void times(ll x);
}tree[263000];
int m,n,p,q;
void abcd :: add(ll x)
{
sum+=x*siz;
sum%=p;
add_mark+=x;
add_mark%=p;
}
void abcd :: times(ll x)
{
sum*=x;
sum%=p;
add_mark*=x;
add_mark%=p;
times_mark*=x;
times_mark%=p;
}
void Build_Tree()
{
int i;
for(i=q+1;i<=q+n;i++)
{
scanf("%d",&tree[i].sum);
tree[i].siz=1;
tree[i].add_mark=0;
tree[i].times_mark=1;
}
for(i=q-1;i;i--)
{
tree[i].sum=tree[i<<1].sum+tree[i<<1|1].sum;
tree[i].sum%=p;
tree[i].siz=tree[i<<1].siz+tree[i<<1|1].siz;
tree[i].add_mark=0;
tree[i].times_mark=1;
}
}
int stack[M],top;
void Push_Down(int x)
{
if(x>=q)
return ;
if(tree[x].times_mark^1)
{
tree[x<<1 ].times(tree[x].times_mark);
tree[x<<1|1].times(tree[x].times_mark);
tree[x].times_mark=1;
}
if(tree[x].add_mark)
{
tree[x<<1 ].add(tree[x].add_mark);
tree[x<<1|1].add(tree[x].add_mark);
tree[x].add_mark=0;
}
}
void Push_Down(int x,int y)
{
for(x+=q-1,y+=q+1;x^y;x>>=1,y>>=1)
stack[++top]=x,stack[++top]=y;
for(;x;x>>=1)
stack[++top]=x;
while(top)
Push_Down(stack[top--]);
}
void Add(int x,int y,ll z)
{
for(x+=q-1,y+=q+1;x^y^1;x>>=1,y>>=1)
{
if(~x&1)tree[x^1].add(z);
if( y&1)tree[y^1].add(z);
}
}
void Times(int x,int y,ll z)
{
for(x+=q-1,y+=q+1;x^y^1;x>>=1,y>>=1)
{
if(~x&1)tree[x^1].times(z);
if( y&1)tree[y^1].times(z);
}
}
void Push_Up(int x)
{
if(x>=q)
return ;
tree[x].sum=tree[x<<1].sum+tree[x<<1|1].sum;
tree[x].sum%=p;
}
void Push_Up(int x,int y)
{
for(x+=q-1,y+=q+1;x^y;x>>=1,y>>=1)
Push_Up(x),Push_Up(y);
for(;x;x>>=1)
Push_Up(x);
}
ll Get_Ans(int x,int y)
{
int re=0;
for(x+=q-1,y+=q+1;x^y^1;x>>=1,y>>=1)
{
if(~x&1)re+=tree[x^1].sum,re%=p;
if( y&1)re+=tree[y^1].sum,re%=p;
}
return re;
}
int main()
{
int i,x,y,c;
ll z;
cin>>n>>p;
for(q=1;q<=n+1;q<<=1);
Build_Tree();
cin>>m;
for(i=1;i<=m;i++)
{
scanf("%d",&c);
if(c==1)
{
scanf("%d%d%lld",&x,&y,&z);
Push_Down(x,y);
Times(x,y,z);
Push_Up(x,y);
}
else if(c==2)
{
scanf("%d%d%lld",&x,&y,&z);
Push_Down(x,y);
Add(x,y,z);
Push_Up(x,y);
}
else
{
scanf("%d%d",&x,&y);
Push_Down(x,y);
printf("%lld\n", Get_Ans(x,y) );
}
}
}

BZOJ 1798 AHOI2009 Seq 维护序列 线段树的更多相关文章

  1. BZOJ 1798: [Ahoi2009]Seq 维护序列seq( 线段树 )

    线段树.. 打个 mul , add 的标记就好了.. 这个速度好像还挺快的...( 相比我其他代码 = = ) 好像是#35.. ---------------------------------- ...

  2. bzoj 1798: [Ahoi2009]Seq 维护序列seq 线段树 区间乘法区间加法 区间求和

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeO ...

  3. Bzoj 1798: [Ahoi2009]Seq 维护序列seq(线段树区间操作)

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小可 ...

  4. bzoj 1798: [Ahoi2009]Seq 维护序列seq (线段树 ,多重标记下放)

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 7773  Solved: 2792[Submit ...

  5. bzoj 1798 [Ahoi2009]Seq 维护序列seq(线段树+传标)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1798 [题意] 给定一个序列,要求提供区间乘/加,以及区间求和的操作 [思路] 线段树 ...

  6. bzoj 1798 [Ahoi2009]Seq 维护序列seq

    原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1798 线段树区间更新: 1. 区间同同时加上一个数 2. 区间同时乘以一个数 #inclu ...

  7. [BZOJ1798][AHOI2009]Seq维护序列 线段树

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1798 一眼看过去线段树,事实上就是线段树.对于乘和加的两个标记,我们可以规定一个顺序,比如 ...

  8. bzoj 1798 [Ahoi2009]Seq 维护序列seq ——线段树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1798 先乘后加,就可给加法标记乘上乘法标记. 注意可能有 *0 的操作,所以 pshd 时不 ...

  9. BZOJ 1798: [Ahoi2009]Seq 维护序列seq (线段树乘法加法的混合操作)

     题目:点击打开链接 大意:一个数组.三个操作.第一种是区间[a,b]每一个数乘乘,另外一种是区间[a,b]每一个数加c,第三种是查询[a,b]区间的和并对p取摸. 两种操作就不能简单的仅仅往下传 ...

随机推荐

  1. 自问自答:在VB中如何实现像C++一样printf的功能

    问: 每个整型都转换成5位的字符串,不足的在前面补0.比如:1转换成“00001”,10转换成“00010”.怎么实现? 答: format(1,"00000") from: 百度 ...

  2. ios中将事件同步到系统日历

    //获取日历事件 EKEventStore* eventStore = [[EKEventStorealloc] init]; NSDate* ssdate = [NSDatedateWithTime ...

  3. FTTB FTTC FTTH FTTO FSA

    FTTB Fiber to The Building 光纤到楼 FTTC Fiber to The Curb 光纤到路边 FTTH Fiber to The Home 光纤到家 FTTO Fiber ...

  4. 用Qemu模拟vexpress-a9 (五) --- u-boot引导kernel,device tree的使用

    环境介绍 Win7 64 + Vmware 11 + ubuntu14.04 32 u-boot 版本:u-boot-2015-04 Linux kernel版本:linux-3.16.y busyb ...

  5. oracle表空间操作语句

    1.查看所有表空间及表空间大小: select tablespace_name ,sum(bytes) / 1024 / 1024 as MB from dba_data_files group by ...

  6. Scut游戏服务器免费开源框架--快速开发(3)

    Scut快速开发(3) 1     开发环境 Scut Lib版本:5.2.3.2 需要安装的软件 a)        IIS和消息队列(MSMQ) b)        数据库,Sql2005以上版本 ...

  7. HTML5 canvas图形库 RGraph【转】

    RGraph是一个使用HTML5 Canvas标签实现的图表制作Library.利用该Library生成的Chart具有可交互性,当鼠标点击或移过时会显示相应的信息,可以动态加载Chart或对特殊点进 ...

  8. GLSL使用FBO实现MRT(Multiple Render Targets)绘制到多张纹理 【转】

    项目的程序里设计需要将某一帧渲染出来的画面拆成三通道单色图像存到三张纹理里面.要绘制到纹理里,自然就想到FBO了.但是一次要输出多张纹理,这个还没接触过.一阵网上搜索过后,终于了解到了MRT(多重渲染 ...

  9. 验收测试 - WebDriver 5

    验收测试 - WebDriver - 配置 什么是WebDriver 这样说好了,它翻译起来就是Web驱动,用我的经验来说,它就是驱动浏览器运行的一个驱动器 有什么作用? 就像一个司机可以驱动一台汽车 ...

  10. SSH 错误解决案例1:Read from socket failed: Connection reset by peer

    今天早上天天连接的开发机突然报出连接错误. 这个错误是SSH最常见错误,造成的原因也是千奇百怪(具体可goole),下面描述我的server的问题: 客户端报错 [root@server]# ssh ...