bzoj1798 1
1798: [Ahoi2009]Seq 维护序列seq
Time Limit: 30 Sec Memory Limit: 64 MB
Submit: 5866 Solved: 2079
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1 2 3 4 5 6 7
5
1 2 5 5
3 2 4
2 3 7 9
3 1 3
3 4 7
Sample Output
35
8
HINT
【样例说明】
初始时数列为(1,2,3,4,5,6,7)。
经过第1次操作后,数列为(1,10,15,20,25,6,7)。
对第2次操作,和为10+15+20=45,模43的结果是2。
经过第3次操作后,数列为(1,10,24,29,34,15,16}
对第4次操作,和为1+10+24=35,模43的结果是35。
对第5次操作,和为29+34+15+16=94,模43的结果是8。
测试数据规模如下表所示
数据编号 1 2 3 4 5 6 7 8 9 10
N= 10 1000 1000 10000 60000 70000 80000 90000 100000 100000
M= 10 1000 1000 10000 60000 70000 80000 90000 100000 100000
Source
#include<vector>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
#define N 200010
ll n,m,p;
ll a[N];
ll sum[N<<],tag1[N<<],tag2[N<<];
void build(int l,int r,int x)
{
if(l==r)
{
sum[x]=a[l];
return;
}
int mid=(l+r)>>;
build(l,mid,x<<);
build(mid+,r,x<<|);
sum[x]=sum[x<<]+sum[x<<|];
sum[x]%=p;
}
void pushdown(int x,int l,int r)
{
if(!tag1[x]&&tag2[x]==) return;
int mid=(l+r)>>;
tag2[x<<]=tag2[x<<]*tag2[x]%p;
tag2[x<<|]=tag2[x<<|]*tag2[x]%p;
tag1[x<<]=(tag1[x<<]*tag2[x]+tag1[x])%p;
tag1[x<<|]=(tag1[x<<|]*tag2[x]+tag1[x])%p;
sum[x<<]=(sum[x<<]*tag2[x]+(mid-l+)*tag1[x])%p;
sum[x<<|]=(sum[x<<|]*tag2[x]+(r-mid)*tag1[x])%p;
tag1[x]=; tag2[x]=;
}
void update1(int l,int r,int x,int a,int b,int c)
{
if(l>b||r<a) return;
if(l>=a&&r<=b)
{
tag2[x]*=c;
tag1[x]*=c;
sum[x]*=c;
sum[x]%=p; tag2[x]%=p; tag1[x]%=p;
return;
}
pushdown(x,l,r);
int mid=(l+r)>>;
update1(l,mid,x<<,a,b,c);
update1(mid+,r,x<<|,a,b,c);
sum[x]=sum[x<<]+sum[x<<|];
sum[x]%=p;
}
void update2(int l,int r,int x,int a,int b,int c)
{
if(l>b||r<a) return;
if(l>=a&&r<=b)
{
tag1[x]+=c;
sum[x]+=(r-l+)*c;
sum[x]%=p; tag1[x]%=p;
return;
}
pushdown(x,l,r);
int mid=(l+r)>>;
update2(l,mid,x<<,a,b,c);
update2(mid+,r,x<<|,a,b,c);
sum[x]=sum[x<<]+sum[x<<|];
sum[x]%=p;
}
ll query(int l,int r,int x,int a,int b)
{
if(l>b||r<a) return ;
if(l>=a&&r<=b) return sum[x];
ll ret=; int mid=(l+r)>>;
pushdown(x,l,r);
ret+=query(l,mid,x<<,a,b);
ret+=query(mid+,r,x<<|,a,b);
ret%=p;
return ret;
}
int main()
{
scanf("%d%d",&n,&p);
for(int i=;i<N;i++) tag2[i]=;
for(int i=;i<=n;i++) scanf("%d",&a[i]);
build(,n,);
scanf("%d",&m);
while(m--)
{
int opt,l,r,c; scanf("%d",&opt);
if(opt==)
{
scanf("%d%d%d",&l,&r,&c); update1(,n,,l,r,c);
}
if(opt==)
{
scanf("%d%d%d",&l,&r,&c); update2(,n,,l,r,c);
}
if(opt==)
{
scanf("%d%d",&l,&r);
printf("%lld\n",query(,n,,l,r));
}
// debug(1,n,1);
}
// fclose(stdin);
// fclose(stdout);
return ;
}
bzoj1798 1的更多相关文章
- BZOJ1798: [Ahoi2009]Seq 维护序列seq[线段树]
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 5504 Solved: 1937[Submit ...
- BZOJ1798: [Ahoi2009]Seq 维护序列seq
传送门 写这道题是为了get一个同时传送乘法下标和加法下标的小技巧,线段树模板题.不多说. 标记名字打错无限智力-- //BZOJ 1798 //by Cydiater //2016.9.13 #in ...
- BZOJ1798——[Ahoi2009]Seq维护序列seq
1.题目大意:区间修改乘法操作和加法操作,求区间和 2.分析:为了填补bzoj2631的坑还是写一发题解吧,首先呢,既然想要双标记,但是这两个标记之间又有着制约作用,所以要定义优先级,这个优先级就定义 ...
- BZOJ1798[Ahoi2009]Seq 维护序列seq 题解
题目大意: 有长为N的数列,有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一段数全部加一个值; (3)询问数列中的一段数的和,由于答案可能很大,你只需输出这个数模P的值. ...
- 【双标记线段树】bzoj1798维护序列seq
一.题目 描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列 ...
- 【bzoj1798】维护序列
线段树维护两个标记. *0的操作在实质上没有任何影响. #include <cstdio> #include <cctype> #define rep(i,a,b) for ( ...
- bzoj1798 [Ahoi2009]维护序列
Description 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2 ...
- BZOJ1798 AHOI2009 维护数列
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小 ...
- 【BZOJ1798】【AHOI2009】维护序列(线段树)
题目链接 题解 这不就是luogu的线段树2的板子吗.... 没有任何的区别... 上代码吧... #include<iostream> #include<cstdio> #i ...
- 【线段树】【BZOJ1798】【AHOI2009】维护序列
还是那个学弟@lher出的丧题之一. 链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1798 题意简析:就是题目啊... 解题思路:显然是线段树 ...
随机推荐
- POJ 2195 Going Home【最小费用流 二分图最优匹配】
题目大意:一个n*m的地图,上面有一些人man(m)和数量相等的house(H) 图上的距离为曼哈顿距离 问所有人住进一所房子(当然一个人住一间咯)距离之和最短是多少? 思路:一个人一间房,明显是二分 ...
- ubuntu使用git提交github时,执行pull或者push命令要重新输入用户名和密码
ubuntu使用git提交github时,执行pull或者push命令要重新输入用户名和密码: 1:问题现象: hlp@hlp:~/code/github_code/catch_imooc1$ git ...
- [Baltic2007]序列问题Sequence
Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 1002 Solved: 535[Submit][Status][Discuss] Descriptio ...
- BZOJ1775: [Usaco2009 Dec]Vidgame 电视游戏问题
n<=50个游戏机有花费,每个游戏机有Gi<=10种游戏,每种游戏有花费有收益,买了游戏机才能玩对应游戏,求最大收益. 这就是一个背包!不过有依存关系,就不会了! 方法一:f[i][j]表 ...
- redis安装【三】
目录介绍: 0.Windows下下载安装包: 下载地址: https://redis.io/ 1.上传到linux服务器 将文件上传到192.168.2.128主机的usr/local目录下: C:\ ...
- jsoup 提取 html 中的所有链接、图片和媒体
原文:http://www.open-open.com/code/view/1420729333515 package org.jsoup.examples; import org.jsoup.Jso ...
- XMLHttpRequest对象解读
<!DOCTYPE html> <html> <body> <script> function reqListener () { console.log ...
- C++开发人脸性别识别教程(8)——搭建MFC框架之读取目录信息
在上一篇博客中我们已经绘制了MFC界面,在这篇博客中我们将加入响应代码,为MFC框架加入一个最主要的功能:打开一个目录. 一.加入相关头文件 这里头文件主要包括三类:opencv头文件.批量读取文件相 ...
- hdoj 4790 Just Random 【数学】
题目:hdoj 4790 Just Random 题意:给你两个闭区间[a,b],[c,d],分别从中等可能的跳出 x 和 y ,求(x+y)%p == m的概率 分析: 假如是[3,5] [4,7] ...
- C++问题记录
问题idx: 1) 怎么在VS2010下新建一个像VC6.0 中那样的控制台C++程序. cdate: 2014-4-24 A1: VC6.0 对标准C++集的支持不是太好, VS2010也有一些吧, ...