bzoj 1798 [Ahoi2009]Seq 维护序列seq
原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1798
线段树区间更新:
1. 区间同同时加上一个数
2. 区间同时乘以一个数
- #include<algorithm>
- #include<iostream>
- #include<cstdlib>
- #include<cstdio>
- #define lc root<<1
- #define rc root<<1|1
- typedef unsigned long long ull;
- const int Max_N = ;
- int Mod;
- struct Node {
- ull sum, add, mul;
- };
- struct SegTree {
- Node seg[Max_N << ];
- inline void push_up(int root) {
- seg[root].sum = (seg[lc].sum + seg[rc].sum) % Mod;
- }
- inline void built(int root, int l, int r) {
- seg[root].add = , seg[root].mul = ;
- if (l == r) {
- scanf("%lld", &seg[root].sum);
- seg[root].sum %= Mod;
- return;
- }
- int mid = (l + r) >> ;
- built(lc, l, mid);
- built(rc, mid + , r);
- push_up(root);
- }
- inline void push_down(int root, int len) {
- if (seg[root].add != || seg[root].mul != ) {
- ull &_add = seg[root].add, &_mul = seg[root].mul;
- seg[lc].sum = (seg[lc].sum * _mul + (len - (len >> )) * _add) % Mod;
- seg[lc].mul = (seg[lc].mul * _mul) % Mod;
- seg[lc].add = (seg[lc].add * _mul + _add) % Mod;
- seg[rc].sum = (seg[rc].sum * _mul + (len >> ) * _add) % Mod;
- seg[rc].mul = (seg[rc].mul * _mul) % Mod;
- seg[rc].add = (seg[rc].add * _mul + _add) % Mod;
- _add = , _mul = ;
- }
- }
- inline void update(int root, int l, int r, int x, int y, ull val, ull mul) {
- if (x > r || y < l) return;
- if (x <= l && y >= r) {
- seg[root].add = (seg[root].add * mul + val) % Mod;
- seg[root].mul = (seg[root].mul * mul) % Mod;
- seg[root].sum = (seg[root].sum * mul + val * (r - l + )) % Mod;
- return;
- }
- push_down(root, r - l + );
- int mid = (l + r) >> ;
- update(lc, l, mid, x, y, val, mul);
- update(rc, mid + , r, x, y, val, mul);
- push_up(root);
- }
- inline ull query(int root, int l, int r, int x, int y) {
- if (x > r || y < l) return ;
- if (x <= l && y >= r) {
- return seg[root].sum;
- }
- push_down(root, r - l + );
- ull ret = ;
- int mid = (l + r) >> ;
- ret += query(lc, l, mid, x, y);
- ret += query(rc, mid + , r, x, y);
- return ret %= Mod;
- }
- }seg;
- int main() {
- #ifdef LOCAL
- freopen("in.txt", "r", stdin);
- freopen("out.txt", "w+", stdout);
- #endif
- int n, m, a, b, c, d;
- while (~scanf("%d %d", &n, &Mod)) {
- seg.built(, , n);
- scanf("%d", &m);
- while (m--) {
- scanf("%d", &a);
- if ( == a) {
- scanf("%d %d %d", &b, &c, &d);
- seg.update(, , n, b, c, , d);
- } else if ( == a) {
- scanf("%d %d %d", &b, &c, &d);
- seg.update(, , n, b, c, d, );
- } else {
- scanf("%d %d", &b, &c);
- printf("%lld\n", seg.query(, , n, b, c));
- }
- }
- }
- return ;
- }
bzoj 1798 [Ahoi2009]Seq 维护序列seq的更多相关文章
- BZOJ 1798: [Ahoi2009]Seq 维护序列seq( 线段树 )
线段树.. 打个 mul , add 的标记就好了.. 这个速度好像还挺快的...( 相比我其他代码 = = ) 好像是#35.. ---------------------------------- ...
- 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 老师交给小可可一个维护数列的任务,现在小可 ...
- 1798: [Ahoi2009]Seq 维护序列seq
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 2930 Solved: 1087[Submit ...
- 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
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1798 大概就是维护两个标记的线段树模板题. 设定优先级,先乘后加(只是相对的),$push ...
- BZOJ1798: [Ahoi2009]Seq 维护序列seq
传送门 写这道题是为了get一个同时传送乘法下标和加法下标的小技巧,线段树模板题.不多说. 标记名字打错无限智力-- //BZOJ 1798 //by Cydiater //2016.9.13 #in ...
- 【BZOJ】1798: [Ahoi2009]Seq 维护序列seq(线段树)
http://www.lydsy.com/JudgeOnline/problem.php?id=1798 之前写了个快速乘..........................20多s...... 还好 ...
- bzoj 1798 [Ahoi2009]Seq 维护序列seq(线段树+传标)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1798 [题意] 给定一个序列,要求提供区间乘/加,以及区间求和的操作 [思路] 线段树 ...
随机推荐
- Oracle 查看表空间剩余与创建空间语法
select a.tablespace_name,total,free,total-free used from ( select tablespace_name,sum(bytes)/1024/10 ...
- ORA-00933: SQL command not properly ended
今天写了一个小的SQL语句类似下面的这句: UPDATE A SET ID=B.ID FROM A,B WHERE A.NAME=B.NAME 在执行时居然报了“ORA-00933: SQL comm ...
- 三味书屋 bbb
为学日益 ,为道日损 .损之又损,以至于无为
- WF4 常用类<第二篇>
一.WorkflowInvoker 常用方法如下: 方法 说明 BeginInvoke() 使用指定的 AsyncCallback 和用户提供的状态以异步方式调用工作流 EndInvoke() 返回使 ...
- java 个人总结
每周课程总结链接: 第一周 第二周 第三周 第四周 第五周 第六周 第七周 第八周 第九周 第十周 java实验报告链接: 实验一 实验二 实验三 实验四 实验五 代码托管链接 课程收获: 学习任何语 ...
- Groovy轻松入门——搭建Groovy开发环境
摘自: http://www.blogjava.net/BlueSUN/archive/2007/03/17/104391.html Groovy轻松入门--搭建Groovy开发环境 多日来,我发表了 ...
- 解读CSS布局之-水平垂直居
对一个元素水平垂直居中,在我们的工作中是会经常遇到的,也是CSS布局中很重要的一部分,本文就来讲讲CSS水平垂直居中的一些方法.由于我们大搜车的日常工作中已经不再需要理会低版本IE,所以本文所贴出的方 ...
- 如何获取tableview中当前选中的cell
当我们点击某个cell时,会执行下面这个方法,方法中调用另一方法执行具体操作: - (void)tableView:(UITableView *)tableView didSelectRowAtInd ...
- 解决Android sdk更新不能下载或下载内容过慢
Android Android SDK 配置步骤 启动 Android SDK Manager ,打开主界面,依次选择「Tools」.「Options...」,弹出『Android SDK Manag ...
- 下载uboot的调试版本到开发板的sdram中运行
开发环境:开发板:FriendlyARM Tiny6410 主机:CentOS release 6.4 (Final) 开发板与主机通过串口线连接 调试用的uboot源码为开发板光盘提供的u-boot ...