1798: [Ahoi2009]Seq 维护序列seq

Time Limit: 30 Sec  Memory Limit: 64 MB
Submit: 5866  Solved: 2079
[Submit][Status][Discuss]

Description

老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成。 有长为N的数列,不妨设为a1,a2,…,aN 。有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一段数全部加一个值; (3)询问数列中的一段数的和,由于答案可能很大,你只需输出这个数模P的值。

Input

第一行两个整数N和P(1≤P≤1000000000)。第二行含有N个非负整数,从左到右依次为a1,a2,…,aN, (0≤ai≤1000000000,1≤i≤N)。第三行有一个整数M,表示操作总数。从第四行开始每行描述一个操作,输入的操作有以下三种形式: 操作1:“1 t g c”(不含双引号)。表示把所有满足t≤i≤g的ai改为ai×c (1≤t≤g≤N,0≤c≤1000000000)。 操作2:“2 t g c”(不含双引号)。表示把所有满足t≤i≤g的ai改为ai+c (1≤t≤g≤N,0≤c≤1000000000)。 操作3:“3 t g”(不含双引号)。询问所有满足t≤i≤g的ai的和模P的值 (1≤t≤g≤N)。 同一行相邻两数之间用一个空格隔开,每行开头和末尾没有多余空格。

Output

对每个操作3,按照它在输入中出现的顺序,依次输出一行一个整数表示询问结果。

Sample Input

7 43
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

2
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

这道题我不得不吐槽一下:两道题爆空间的形式还不一样,一个re,一个mle。。。真是智能
我先开始脑残,每个点开个vector存标记。。。。。。。直接爆空间 还有要不停地%%%%%%%%
#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的更多相关文章

  1. BZOJ1798: [Ahoi2009]Seq 维护序列seq[线段树]

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

  2. BZOJ1798: [Ahoi2009]Seq 维护序列seq

    传送门 写这道题是为了get一个同时传送乘法下标和加法下标的小技巧,线段树模板题.不多说. 标记名字打错无限智力-- //BZOJ 1798 //by Cydiater //2016.9.13 #in ...

  3. BZOJ1798——[Ahoi2009]Seq维护序列seq

    1.题目大意:区间修改乘法操作和加法操作,求区间和 2.分析:为了填补bzoj2631的坑还是写一发题解吧,首先呢,既然想要双标记,但是这两个标记之间又有着制约作用,所以要定义优先级,这个优先级就定义 ...

  4. BZOJ1798[Ahoi2009]Seq 维护序列seq 题解

    题目大意: 有长为N的数列,有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一段数全部加一个值; (3)询问数列中的一段数的和,由于答案可能很大,你只需输出这个数模P的值. ...

  5. 【双标记线段树】bzoj1798维护序列seq

    一.题目 描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列 ...

  6. 【bzoj1798】维护序列

    线段树维护两个标记. *0的操作在实质上没有任何影响. #include <cstdio> #include <cctype> #define rep(i,a,b) for ( ...

  7. bzoj1798 [Ahoi2009]维护序列

    Description 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2 ...

  8. BZOJ1798 AHOI2009 维护数列

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

  9. 【BZOJ1798】【AHOI2009】维护序列(线段树)

    题目链接 题解 这不就是luogu的线段树2的板子吗.... 没有任何的区别... 上代码吧... #include<iostream> #include<cstdio> #i ...

  10. 【线段树】【BZOJ1798】【AHOI2009】维护序列

    还是那个学弟@lher出的丧题之一. 链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1798 题意简析:就是题目啊... 解题思路:显然是线段树 ...

随机推荐

  1. poj 2081 简单递推

    #include<stdio.h> #include<string.h> #define N 510000 int dp[N]; int f[10000000]; int ma ...

  2. sequence(bzoj 1367)

    Description Input Output 一个整数R Sample Input 794820141518 Sample Output 13 HINT 所求的Z序列为6,7,8,13,14,15 ...

  3. apache cgi 模块安装

    apache安装,请参照:http://httpd.apache.org/docs/2.4/ 安装系统: Fedora release 21 (Twenty One)  (x64) 版本:Server ...

  4. django学习之- CSRF及中间件

    CSRF # 表示django全局发送post请求均需要字符串验证功能:防止跨站请求伪造的功能工作原理:客户端访问服务器端,在服务器端正常返回给客户端数据的时候,而外返回给客户端一段字符串,等到客户端 ...

  5. 洛谷 P4720 【模板】扩展 / 卢卡斯 模板题

    扩展卢卡斯定理 : https://www.luogu.org/problemnew/show/P4720 卢卡斯定理:https://www.luogu.org/problemnew/show/P3 ...

  6. Spring4 基本使用

    前言 虽然现在基本上是 springboot 的天下了,但是传统的 spring4 在广大的软件企业中仍然占据很大比例.一上手能用,但是要让我从无到有搭一个spring4的开发环境出来,可能会磕磕碰碰 ...

  7. Spring中使用byType实现Beans自动装配

    以下内容引用自http://wiki.jikexueyuan.com/project/spring/beans-auto-wiring/spring-autowiring-byType.html: 此 ...

  8. VB6 如何连接MYSQL数据库

    1 从官网下载MYSQL的ODBC,选择与自己操作系统对应的版本(前提是你安装了MYSQL) http://dev.mysql.com/downloads/connector/odbc/   2 安装 ...

  9. vue 获取当前时间 格式YYYY-MM-DD

    函数封装: /** * 获取当前时间 * 格式YYYY-MM-DD */ Vue.prototype.getNowFormatDate = function() { var date = new Da ...

  10. AIDL/IPC Android AIDL/IPC 进程通信机制——超具体解说及使用方法案例剖析(播放器)

    首先引申下AIDL.什么是AIDL呢?IPC? ------ Designing a Remote Interface Using AIDL 通常情况下,我们在同一进程内会使用Binder.Broad ...