BZOJ 1798 AHOI2009 Seq 维护序列 线段树
题目大意:维护一个序列,提供三种操作:
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 维护序列 线段树的更多相关文章
- BZOJ 1798: [Ahoi2009]Seq 维护序列seq( 线段树 )
线段树.. 打个 mul , add 的标记就好了.. 这个速度好像还挺快的...( 相比我其他代码 = = ) 好像是#35.. ---------------------------------- ...
- bzoj 1798: [Ahoi2009]Seq 维护序列seq 线段树 区间乘法区间加法 区间求和
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeO ...
- Bzoj 1798: [Ahoi2009]Seq 维护序列seq(线段树区间操作)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小可 ...
- bzoj 1798: [Ahoi2009]Seq 维护序列seq (线段树 ,多重标记下放)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 7773 Solved: 2792[Submit ...
- bzoj 1798 [Ahoi2009]Seq 维护序列seq(线段树+传标)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1798 [题意] 给定一个序列,要求提供区间乘/加,以及区间求和的操作 [思路] 线段树 ...
- bzoj 1798 [Ahoi2009]Seq 维护序列seq
原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1798 线段树区间更新: 1. 区间同同时加上一个数 2. 区间同时乘以一个数 #inclu ...
- [BZOJ1798][AHOI2009]Seq维护序列 线段树
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1798 一眼看过去线段树,事实上就是线段树.对于乘和加的两个标记,我们可以规定一个顺序,比如 ...
- bzoj 1798 [Ahoi2009]Seq 维护序列seq ——线段树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1798 先乘后加,就可给加法标记乘上乘法标记. 注意可能有 *0 的操作,所以 pshd 时不 ...
- BZOJ 1798: [Ahoi2009]Seq 维护序列seq (线段树乘法加法的混合操作)
题目:点击打开链接 大意:一个数组.三个操作.第一种是区间[a,b]每一个数乘乘,另外一种是区间[a,b]每一个数加c,第三种是查询[a,b]区间的和并对p取摸. 两种操作就不能简单的仅仅往下传 ...
随机推荐
- java web定时任务---Timer
写在前面: 在最近的项目中需要每天定时对数据库表进行查询,并完成相关数据的更新操作.首先让我想到的是Timer类,记得在一开始维护那个老系统的时候,开了个接口,也涉及到了定时的操作.下面就记录下大概的 ...
- 使用MR求解多个矩阵的乘积之后
首先介绍涉及到的知识点,如下: 1)value的类型是IntArrayWritable,将整型数组值取出的方法有两种. a.其一,就是使用value的toArray()方法,返回值是一个Object ...
- codevs 4163 求逆序对的数目 -树状数组法
4163 hzwer与逆序对 时间限制: 10 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题目描述 Description hzwer在研究逆序对. 对于数列{a},如果 ...
- xcode中一些便捷用法@literals简写
总结一下,新的属性绑定规则如下: ● 除非开发者在实现文件中提供getter或setter,否则将自动生成 ● 除非开发者同时提供getter和setter,否则将自动生成实例变量 ● 只要写了s ...
- Matlab设置字体大小
1. 设置坐标轴上下限:axis([xmin,xmax,ymin,ymax]); 2. 设置图片大小:set(gcf,'Position',[x1,y1,dx,dy]); x1和y1是图的左下角坐 ...
- 【MyEcplise】导入项目后,会定时弹出一下错误MyEcplise tern was unable to complete your request in time.This couble happen if your project contains several large javaScript libraies.
Myecplise弹出错误如下: 错误代码: MyEcplise tern was unable to complete your request in time.This couble happen ...
- Oracle的日志记录模式
本篇摘自 http://www.cnblogs.com/cnjava/archive/2012/04/09/2439497.html --=============================== ...
- redis push/pop(List)的17条命令
一.Blpop 命令移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止.redis 127.0.0.1:6379> BLPOP LIST1 LIST2 .. ...
- 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-人机界面快速入门 TC2
创建最简单的静态文本,就像是label,就只需要绘制一个矩形框,然后填写Text,取消边框即可(你也可以设置自定义字体) 创建动态的文本框,就像是textbox,需要设置这个矩形框的Text为%d ...
- Java8 CompletableFuture组合式的编程(笔记)
* 实现异步API public double getPrice(String product) { return calculatePrice(product); } /** * 同步计算商品价格的 ...