BZOJ1798: [Ahoi2009]Seq 维护序列seq
写这道题是为了get一个同时传送乘法下标和加法下标的小技巧,线段树模板题。不多说。
标记名字打错无限智力--
//BZOJ 1798
//by Cydiater
//2016.9.13
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <iomanip>
#include <cstdlib>
#include <cmath>
#include <ctime>
using namespace std;
#define ll unsigned long long
#define up(i,j,n) for(int i=j;i<=n;i++)
#define down(i,j,n) for(int i=j;i>=n;i--)
#define FILE "seqb"
;
const ll oo=0x3f3f3f3f;
inline ll read(){
,f=;
;ch=getchar();}
+ch-';ch=getchar();}
return x*f;
}
struct SegTree{
ll v,delta1,delta2,leftt,rightt;
}t[MAXN<<];
ll N,mod,M,op,x,y,Delta1,Delta2,a[MAXN];
namespace solution{
inline void downit(int node){
if(t[node].leftt==t[node].rightt)return;
ll delta1=t[node].delta1,delta2=t[node].delta2,leftt,rightt;
t[node].delta1=;t[node].delta2=;
){
t[node<<].delta1*=delta2;t[node<<].delta1%=mod;
t[node<<].delta2*=delta2;t[node<<].delta2%=mod;
t[node<<].v*=delta2;t[node<<].delta2%=mod;
t[node<<|].delta1*=delta2;t[node<<|].delta1%=mod;
t[node<<|].delta2*=delta2;t[node<<|].delta2%=mod;
t[node<<|].v*=delta2;t[node<<|].delta2%=mod;
}
leftt=t[node<<].leftt;rightt=t[node<<].rightt;
t[node<<].delta1+=delta1;t[node<<].delta1%=mod;
t[node<<].v+=(rightt-leftt+)*delta1;t[node<<].v%=mod;
leftt=t[node<<|].leftt;rightt=t[node<<|].rightt;
t[node<<|].delta1+=delta1;t[node<<|].delta1%=mod;
t[node<<|].v+=(rightt-leftt+)*delta1;t[node<<|].v%=mod;
}
inline ].v+t[node<<|].v)%mod;}
inline void updata(int leftt,int rightt,int root){
downit(root);
if(leftt>y||rightt<x) return;
if(leftt>=x&&rightt<=y){
if(Delta1){
t[root].delta1+=Delta1;
t[root].v+=(rightt-leftt+)*Delta1;
t[root].delta1%=mod;
t[root].v%=mod;
}
){
t[root].delta1*=Delta2;t[root].delta1%=mod;
t[root].delta2*=Delta2;t[root].delta2%=mod;
t[root].v*=Delta2;t[root].v%=mod;
}
return;
}
;
updata(leftt,mid,root<<);
updata(mid+,rightt,root<<|);
reload(root);
}
inline ll find(int leftt,int rightt,int root){
downit(root);
;
if(leftt>=x&&rightt<=y) return t[root].v;
;
)+find(mid+,rightt,root<<|))%mod;
}
inline void build(int leftt,int rightt,int root){
t[root].delta2=;
if(leftt==rightt){
t[root].leftt=t[root].rightt=leftt;
t[root].v=a[leftt];t[root].delta1=;
return;
}
t[root].leftt=leftt;t[root].rightt=rightt;t[root].delta1=;
;
build(leftt,mid,root<<);
build(mid+,rightt,root<<|);
reload(root);
}
void slove(){
N=read();mod=read();
up(i,,N)a[i]=read();
build(,N,);
M=read();
while(M--){
op=read();x=read();y=read();
){
Delta1=;Delta2=read();
updata(,N,);
}
){
Delta1=read();Delta2=;
updata(,N,);
}
){
printf(,N,));
//cout<<find(1,N,1)<<endl;
}
}
}
}
int main(){
//freopen(FILE".in","r",stdin);
//freopen("input.in","r",stdin);
//freopen(FILE".out","w",stdout);
using namespace solution;
slove();
;
}
BZOJ1798: [Ahoi2009]Seq 维护序列seq的更多相关文章
- BZOJ1798: [Ahoi2009]Seq 维护序列seq[线段树]
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 5504 Solved: 1937[Submit ...
- BZOJ 1798: [Ahoi2009]Seq 维护序列seq( 线段树 )
线段树.. 打个 mul , add 的标记就好了.. 这个速度好像还挺快的...( 相比我其他代码 = = ) 好像是#35.. ---------------------------------- ...
- 1798: [Ahoi2009]Seq 维护序列seq
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 2930 Solved: 1087[Submit ...
- 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 线段树 区间乘法区间加法 区间求和
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 老师交给小可可一个维护数列的任务,现在小可 ...
- BZOJ1798[Ahoi2009]Seq 维护序列seq 题解
题目大意: 有长为N的数列,有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一段数全部加一个值; (3)询问数列中的一段数的和,由于答案可能很大,你只需输出这个数模P的值. ...
- 【bzoj1798】[Ahoi2009]Seq 维护序列seq 线段树
题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一 ...
- 【分块】bzoj1798 [Ahoi2009]Seq 维护序列seq
分块,打标记,维护两个标记:乘的 和 加的. 每次 区间乘的时候,对 乘标记 和 加标记 都 乘上那个值. 每次 区间加的时候 对 加标记 加上那个值. (ax+b)*v=axv+bv.开 long ...
- [bzoj1798][Ahoi2009]Seq 维护序列seq ([洛谷P3373]【模板】线段树 2)
题目大意:有$n$个数,有$m$个操作,有三种: $1\;l\;r\;x:$把区间$[l,r]$内的数乘上$x$ $2\;l\;r\;x:$把区间$[l,r]$内的数加上$x$ $3\;l\;r:$询 ...
随机推荐
- web性能优化——简介
简介 性能优化的第一准则:加缓存.几乎绝大部分优化都围绕这个来进行的.让用户最快的看到结果. 性能优化的第二准则:最小原则.绝不提供多余的信息.比如,静态资源(图片.css.js)压缩,图片的滚动加载 ...
- 无线AP和无线路由器区别
无线AP,即Access Point,也就是无线接入点.简单来说就是wifi共享上网中的无线交换机,它是移动终端用户进入有线网络的接入点. AD:51CTO技术沙龙 | 赋予APP不同凡响的交互和体验 ...
- STL中的next_permutation
给定一个数组a[N],求下一个数组. 2 1 3 4 2 1 4 3 2 3 1 4 2 3 4 1 ..... 在STL中就有这个函数: 1.参数是(数组的第一个元素,数组的末尾),注意这是前闭后开 ...
- 关于QString中的arg()函数使用方法
例:正确做法:ui->label->setText(QString("Processingfile%1").arg(index));错误做法: ui->label ...
- [转]Eclipse中的Web项目自动部署到Tomcat
原文地址:http://www.cnblogs.com/ywl925/p/3815173.html 原因 很长时间没用Eclipse了,近期由于又要用它做个简单的JSP项目,又要重新学习了,虽然熟悉的 ...
- Linux_cheat命令安装和使用
1.安装python yum -y install python 2.安装epel源.安装pip yum install epel-release -y yum install python ...
- Maven-搭建普通maven项目
点击Eclipse菜单栏File->New->Ohter->Maven得到如下图所示对话框: 选中Maven Project并点击Next,到下一个对话框(默认)继续点击Next得到 ...
- 数据库开发基础-SQl Server 视图
1.视图的概述 视图其实就是一条查询sql语句,用于显示一个或多个表或其他视图中的相关数据.视图将一个查询的结果作为一个表来使用,因此视图可以被看作是存储的查询或一个虚拟表.视图 ...
- 压力测试 webbench
Linux下 webbench最多可以模拟3万个并发连接去测试网站的负载能力 webbench -c -t http://127.0.0.1/phpinfo.php 说明: -c 客户端数量(并发数量 ...
- 欢迎加入.Net高级部落 173844862
本群成立至今3年多,聚集了好多大牛级别的人物,欢迎高手前来指教,也欢迎小菜鸟进来学习.群成员热情开朗,有问必答.在这里聊聊技术,谈谈理想,不光技术会得到提高,也会收获一大帮志同道合的朋友,希望在未来的 ...