BZOJ 1798 题解
1798: [Ahoi2009]Seq 维护序列seq
Time Limit: 30 Sec Memory Limit: 64 MB
Submit: 5531 Solved: 1946
[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
Solution
双标记线段树,与普通线段树类似,标记下传时考虑乘法即可。
/**************************************************************
Problem: 1798
User: shadowland
Language: C++
Result: Accepted
Time:4500 ms
Memory:40392 kb
****************************************************************/ #include "bits/stdc++.h" using namespace std ;
typedef long long QAQ ;
const int maxN = ;
struct SegTree { int l , r ; QAQ sum , mul , add ; } tr[ maxN ] ;
QAQ MOD , val ; QAQ arr[ maxN ] ; void Push_up ( const int i ) {
tr[ i ].sum = ( tr[ i << | ].sum + tr[ i << ].sum ) % MOD ;
} void Push_down ( int i , int m ) {
tr[ i << ].add = ( tr[ i << ].add * tr[ i ].mul + tr[ i ].add ) % MOD ;
tr[ i << | ].add = ( tr[ i << | ].add * tr[ i ].mul + tr[ i ].add ) % MOD ;
tr[ i << ].mul = tr[ i << ].mul * tr[ i ].mul % MOD ;
tr[ i << | ].mul = tr[ i << | ].mul * tr[ i ].mul % MOD ;
tr[ i << ].sum = ( tr[ i << ].sum * tr[ i ].mul + tr[ i ].add * ( m - ( m >> ) ) ) % MOD ;
tr[ i << | ].sum = ( tr[ i << | ].sum * tr[ i ].mul + tr[ i ].add * ( m >> ) ) % MOD ;
tr[ i ].add = ;
tr[ i ].mul = ;
} void Build_Tree ( const int x , const int y , const int i ) {
tr[ i ].l = x ; tr[ i ].r = y ;
tr[ i ].mul = ;
if ( x == y ) {
tr[ i ].sum = arr[ x ] ;
return ;
}
else {
int mid = ( x + y ) >> ;
Build_Tree ( x , mid , i << ) ;
Build_Tree ( mid + , y , i << | ) ;
Push_up ( i ) ;
}
} QAQ Query_Tree ( const int q , const int w , const int i ) {
if ( q <= tr[ i ].l && tr[ i ].r <= w ) {
return tr[ i ].sum % MOD ;
}
else {
Push_down ( i , tr[ i ].r - tr[ i ].l + ) ;
int mid = ( tr[ i ].l + tr[ i ].r ) >> ;
if ( q > mid ) return Query_Tree ( q , w , i << | ) % MOD;
else if ( w <= mid ) return Query_Tree ( q , w , i << ) % MOD ;
else return ( Query_Tree ( q , w , i << | ) + Query_Tree ( q , w , i << ) ) % MOD ;
Push_up ( i ) ;
}
} void Update_Tree ( int i , int q , int w , int _ ) {
if ( q <= tr[ i ].l && tr[ i ].r <= w ) {
if ( _ == ) {
tr[ i ].add = tr[ i ].add * val % MOD ;
tr[ i ].mul = tr[ i ].mul * val % MOD ;
tr[ i ].sum = tr[ i ].sum * val % MOD ;
}
else if ( _ == ) {
tr[ i ].add = ( tr[ i ].add + val ) % MOD ;
tr[ i ].sum = ( tr[ i ].sum + ( QAQ ) val * ( tr[ i ].r - tr[ i ].l + ) ) % MOD ;
}
}
else {
Push_down ( i , tr[ i ].r - tr[ i ].l + ) ;
int mid = ( tr[ i ].l + tr[ i ].r ) >> ;
if ( q > mid ) Update_Tree ( i << | , q , w , _ ) ;
else if ( w <= mid ) Update_Tree ( i << , q , w , _ ) ;
else {
Update_Tree ( i << | , q , w , _ ) ;
Update_Tree ( i << , q , w , _ ) ;
}
Push_up ( i ) ;
}
} void DEBUG_( int n ) {
for ( int i= ; i<=n ; ++i ) {
printf ( "\n%d:\nsum:%d\nadd:%d\nmul:%d\n" , i , tr[ i ].sum , tr[ i ].add , tr[ i ].mul ) ;
}
}
int main ( ) {
QAQ N , Q ;
//freopen ( "sbsbs.out" , "w" , stdout ) ;
scanf ( "%lld %lld" , &N , &MOD ) ;
for ( int i= ; i<=N ; ++i ) scanf ( "%lld" , arr + i ) ;
Build_Tree( , N , ) ;
scanf ( "%lld" , &Q ) ;
for ( int i= ; i<=Q ; ++i ){
QAQ op , l , r ;
scanf ( "%lld" , &op ) ;
//DEBUG_( 13 ) ;
if ( op == ) {
scanf ( "%lld %lld" , &l , &r ) ;
printf ( "%lld\n" , Query_Tree ( l , r , ) ) ;
}
else {
scanf ( "%lld %lld %lld" , &l , &r , &val ) ;
Update_Tree ( , l , r , op ) ;
}
}
return ;
}
2016-10-13 22:15:31
(完)
BZOJ 1798 题解的更多相关文章
- bzoj 1798 维护序列seq
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1798 题解: 高级一点的线段树,加上了区间乘法运算,则需要增加一个数组mulv记录乘的因数 ...
- bzoj 1798: [Ahoi2009]Seq 维护序列seq 线段树 区间乘法区间加法 区间求和
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeO ...
- 值得一做》关于双标记线段树两三事BZOJ 1798 (NORMAL-)
这是一道双标记线段树的题,很让人很好的预习/学习/复习线段树,我不知道它能让别人学习什么,反正让我对线段树的了解更加深刻. 题目没什么好讲的,程序也没什么好讲的,所以也没有什么题解,但是值得一做 给出 ...
- BZOJ 3732 题解
3732: Network Description 给你N个点的无向图 (1 <= N <= 15,000),记为:1…N. 图中有M条边 (1 <= M <= 30,000) ...
- bzoj 1798 [Ahoi2009]Seq 维护序列seq
原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1798 线段树区间更新: 1. 区间同同时加上一个数 2. 区间同时乘以一个数 #inclu ...
- bzoj 1798 [Ahoi2009]Seq 维护序列seq(线段树+传标)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1798 [题意] 给定一个序列,要求提供区间乘/加,以及区间求和的操作 [思路] 线段树 ...
- BZOJ 1798: [Ahoi2009]Seq 维护序列seq( 线段树 )
线段树.. 打个 mul , add 的标记就好了.. 这个速度好像还挺快的...( 相比我其他代码 = = ) 好像是#35.. ---------------------------------- ...
- bzoj 2669 题解(状压dp+搜索+容斥原理)
这题太难了...看了30篇题解才整明白到底咋回事... 核心思想:状压dp+搜索+容斥 首先我们分析一下,对于一个4*7的棋盘,低点的个数至多只有8个(可以数一数) 这样的话,我们可以进行一个状压,把 ...
- bzoj 1798: [Ahoi2009]Seq 维护序列seq (线段树 ,多重标记下放)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 7773 Solved: 2792[Submit ...
随机推荐
- 关于配置Spring框架的多个propertyConfigurer的问题
http://blog.csdn.net/aa427/article/details/38375259
- oracle数据库出现“批处理中出现错误: ORA-00001: 违反唯一约束条件”解决方法
最近使用oraclede impdp工具全库导入数据库时,在数据库里面使用出现如下情况. SQL state : 违反唯一约束条件 (GDXAORCL.SYS_C0055359) ; nested e ...
- SQL在INNER JOIN时,也可以将子查询加入进来
这个语法有点神奇,记下. 但觉得用处有限吧. mysql> SELECT a.account_id, a_cust_id, a.open_date, a.product_cd -> FRO ...
- AngularJS——依赖注入
依赖注入 依赖注入(DI)是一个经典的设计模式, 主要是用来处理组件如何获得依赖的问题.关于DI,推荐阅读Martin Flower的文章(http://martinfowler.com/art ...
- JavaScript 简介
JavaScript是一种专为网页交互而设计的脚本语言,由下列三个不同的部分组成: ECMAScript,由ECMA-262 定义,提供核心语言功能: DOM, 提供访问和操作网页内容的方法和接口; ...
- WPF ItemsControl ListBox ListView比较
在进行列表信息展示时,WPF中提供多种列表可供选择.这篇博客将对WPF ItemsControl, ListBox, ListView进行比较. 相同点: 1. 这三个控件都是列表型控件,可以进行列表 ...
- hdu 4046 2011北京赛区网络赛G 线段树 ***
还带这么做的,卧槽,15分钟就被A了的题,居然没搞出来 若某位是1,则前两个为wb,这位就是w #include<cstdio> #include<cstring> #defi ...
- android 消息推送
android 消息推送 极光推送百度云推送(语音)友盟消息推送
- Toast通知
win10 app 开发中Toast通知的模板只有一种,统一为 ToastGeneric 通用型通知,本文我们来讲讲 Toast 的 XML文档相关知识. 在以前8.1时候的Toast通知方式,到了W ...
- opacity
.css{filter:alpha(opacity:30);/*filter是给IE用到*/opacity:.3; }