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 题意简析:就是题目啊... 解题思路:显然是线段树 ...
随机推荐
- 洛谷P1771 方程的解_NOI导刊2010提高(01)
题目描述 佳佳碰到了一个难题,请你来帮忙解决. 对于不定方程a1+a2+…+ak-1+ak=g(x),其中k≥2且k∈N,x是正整数,g(x)=x^x mod 1000(即x^x除以1000的余数), ...
- Vim enhance part1
NO1 .认识.命令 例 删除man.config中第1到30行的注释 1.光标移到#上,按下x删除 2.按下j将光标移到第二行#上,之后按下. 3.可以看到第2行的#也被删除了因为.就是重复上次命令 ...
- [转]GitHub 优秀的 Android 开源项目
GitHub 优秀的 Android 开源项目 主要介绍那些不错个性化的View,包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageV ...
- C#的特性学习草稿
原文发布时间为:2008-11-22 -- 来源于本人的百度文章 [由搬家工具导入] 举个简单的例子: 先定义个特性 从Attribute继承,并标明用法 [AttributeUsage(Attrib ...
- 给你两个字符串str1,str2,找出str2在str1中的位置
如题 题目参考链接: http://blog.csdn.net/hxz_qlh/article/details/14110221 代码来自非原创 #include <iostream> # ...
- linux 开机启动脚本或者服务
https://blog.csdn.net/zhuchunyan_aijia/article/details/53811368
- java去空格
1.trim()是去掉首尾空格 2.str.replace(" ", ""); 去掉所有空格,包括首尾.中间 3.或者replaceAll(&quo ...
- ArcEngine影像图配准
转自原文ArcEngine影像图配准 影像图配准主要包括以下几个方面 1.打开影像图 2.配准 3.影像图入库/保存 1.打开影像图的代码以前已经写过了. 2.配准 配准 主要使用IGeoRefe ...
- TUN/TAP区别
在计算机网络中,TUN与TAP是操作系统内核中的虚拟网络设备.不同于普通靠硬件网路板卡实现的设备,这些虚拟的网络设备全部用软件实现,并向运行于操作系统上的软件提供与硬件的网络设备完全相同的功能. TA ...
- 【转】Web Worker javascript多线程编程(一)
原文:https://www.cnblogs.com/peakleo/p/6218823.html -------------------------------------------------- ...