Time Limit: 50 Sec  Memory Limit: 256 MB
Submit: 1179  Solved: 392
[Submit][Status][Discuss]

Description

  有一个长度为n的序列,有三个操作1.I a b c表示将[a,b]这一段区间的元素集体增加c,2.R a b表示将[a,b]区间内所有元素变成相反数,3.Q a b c表示询问[a,b]这一段区间中选择c个数相乘的所有方案的和mod 19940417的值。

Input

  第一行两个数n,q表示序列长度和操作个数。
  第二行n个非负整数,表示序列。
  接下来q行每行输入一个操作I a b c或者 R a b或者Q a b c意义如题目描述。

Output

  对于每个询问,输出选出c个数相乘的所有方案的和mod19940417的值。

Sample Input

5 5
1 2 3 4 5
I 2 3 1
Q 2 4 2
R 1 5
I 1 3 -1
Q 1 5 1

Sample Output

40
19940397
样例说明
  做完第一个操作序列变为1 3 4 4 5。
  第一次询问结果为3*4+3*4+4*4=40。
  做完R操作变成-1 -3 -4 -4 -5。
  做完I操作变为-2 -4 -5 -4 -5。
  第二次询问结果为-2-4-5-4-5=-20。

HINT

  100%的数据n<=50000,q<=50000,初始序列的元素的绝对值<=109,I a b c中保证[a,b]是一个合法区间,|c|<=109,R a b保证[a,b]是个合法的区间。Q a b c中保证[a,b]是个合法的区间1<=c<=min(b-a+1,20)。

Source

中国国家队清华集训 2012-2013 第三天

码农级线段树题目,,,
子树合并很好想,就是一个卷积;
标记下传也很好想,我的写法的话是先下传正负再下传add。
正负修改也很好想,把add和tag打一下标记然后把i是奇数的f[]变成它的相反数即可。
就是区间加之后的维护有点难度,要推一推式子,但是这里我懒得再推一遍了23333。
#include<bits/stdc++.h>
#define ll long long
#define maxn 50005
#define ha 19940417
using namespace std;
int C[maxn][25],n,m,tp,num;
int a[maxn],le,ri,w,ci[25];inline int add(int x,int y){x+=y;return x>=ha?x-ha:x;
}inline void init(){C[0][0]=1;for(int i=1;i<=n;i++){tp=min(i,20);C[i][0]=1;for(int j=1;j<=tp;j++) C[i][j]=add(C[i-1][j-1],C[i-1][j]);}
}struct node{int tag,ad;int c[25];inline void clear(){memset(c,0,sizeof(c));tag=ad=0;}node operator +(const node &U)const{node r;r.clear();for(int i=0;i<=20;i++) if(c[i])for(int j=i;j<=20;j++) if(U.c[j-i])r.c[j]=add(r.c[j],c[i]*(ll)U.c[j-i]%ha);return r;}
}b[maxn<<2|1],AN;
char ch;void build(int o,int l,int r){if(l==r){b[o].c[0]=1;b[o].c[1]=a[l];return;}int mid=l+r>>1,lc=o<<1,rc=(o<<1)|1;build(lc,l,mid);build(rc,mid+1,r);b[o]=b[lc]+b[rc];
}inline void work(int o,int d,int len){tp=min(len,20);ci[0]=1;for(int i=1;i<=tp;i++) ci[i]=ci[i-1]*(ll)d%ha;b[o].ad=add(b[o].ad,d);for(int i=20;i;i--){int S=i,T=len;for(int j=0;j<i;j++,S--,T--){b[o].c[i]=add(b[o].c[i],b[o].c[j]*(ll)ci[i-j]%ha*(ll)C[T][S]%ha);}}
}inline void rotate(int o,int len){b[o].tag^=1,b[o].ad=ha-b[o].ad;for(int i=1;i<=20;i+=2) b[o].c[i]=ha-b[o].c[i];
}inline void pushdown(int o,int l,int r){int mid=l+r>>1,lc=o<<1,rc=(o<<1)|1;if(b[o].tag){rotate(lc,mid-l+1);rotate(rc,r-mid);b[o].tag=0;}if(b[o].ad){work(lc,b[o].ad,mid-l+1);work(rc,b[o].ad,r-mid);b[o].ad=0;}
}void updateX(int o,int l,int r){if(l>=le&&r<=ri){work(o,w,r-l+1);     return;}int mid=l+r>>1,lc=o<<1,rc=(o<<1)|1;pushdown(o,l,r);if(le<=mid) updateX(lc,l,mid);if(ri>mid) updateX(rc,mid+1,r);b[o]=b[lc]+b[rc];
}void updateY(int o,int l,int r){if(l>=le&&r<=ri){rotate(o,r-l+1);return;}int mid=l+r>>1,lc=o<<1,rc=(o<<1)|1;pushdown(o,l,r);if(le<=mid) updateY(lc,l,mid);if(ri>mid) updateY(rc,mid+1,r);b[o]=b[lc]+b[rc];
}void query(int o,int l,int r){if(l>=le&&r<=ri){AN=AN+b[o];return;}int mid=l+r>>1,lc=o<<1,rc=(o<<1)|1;pushdown(o,l,r);if(le<=mid) query(lc,l,mid);if(ri>mid) query(rc,mid+1,r);
}int main(){scanf("%d%d",&n,&m);init();for(int i=1;i<=n;i++){scanf("%d",a+i);a[i]%=ha;if(a[i]<0) a[i]+=ha;}build(1,1,n);while(m--){ch=getchar();while(ch!='I'&&ch!='R'&&ch!='Q') ch=getchar();scanf("%d%d",&le,&ri);if(ch=='R') updateY(1,1,n);else{scanf("%d",&w);if(ch=='Q'){AN.clear();AN.c[0]=1;query(1,1,n);printf("%d\n",AN.c[w]);}else{w%=ha;if(w<0) w+=ha;updateX(1,1,n);}}}return 0;
}

  

转载于:https://www.cnblogs.com/JYYHH/p/8496566.html

bzoj 2962: 序列操作相关推荐

  1. bzoj 2962 序列操作

    2962: 序列操作 Time Limit: 50 Sec  Memory Limit: 256 MB [Submit][Status][Discuss] Description 有一个长度为n的序列 ...

  2. bzoj 2962 序列操作 线段树

    这个题卡常数.. 首先c比较小,所以可以考虑dp转移,对于合并子序列就直接枚举跨区间的就可以了 对于反转操作,要注意只有奇数位置才会变成相反数 对于增加操作,可以考虑抽象成组合数学问题: 对于(a1+ ...

  3. 【BZOJ-1858】序列操作 线段树

    1858: [Scoi2010]序列操作 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 1961  Solved: 991 [Submit][Stat ...

  4. 问题 F: 序列操作Ⅱ(前缀最大公约数,后缀最大公约数)

    问题 F: 序列操作Ⅱ 时间限制: 1 Sec 内存限制: 128 MB [提交][状态][讨论版] 题目描述 给定长度为 N 的正整数序列 A_1, A_2, A_3,-, A_N, 从中选择一个数 ...

  5. 问题 E: 序列操作Ⅰ(01背包)

    问题 E: 序列操作Ⅰ 时间限制: 1 Sec 内存限制: 128 MB [提交][状态][讨论版] 题目描述 给定长度为 N 的正整数序列 A_1, A_2, A_3,-, A_N, 从中选出若干个 ...

  6. P2572 [SCOI2010]序列操作

    对自己 & \(RNG\) : 骄兵必败 \(lpl\)加油! P2572 [SCOI2010]序列操作 题目描述 lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要 ...

  7. Python中的序列操作

    Python中的序列操作 分类: python undefined 官方手册:https://docs.python.org/3.7/library/stdtypes.html#sequence-ty ...

  8. [转载] 列表、元组及通用序列操作

    参考链接: Python | 重点数据类型 (字符串,列表,元组,迭代)(String, List, Tuple, Iteration) 序列是Python中最基本的数据结构(一些基本特性类似于C++ ...

  9. python pickle库_Python使用Pickle库实现读写序列操作示例

    本文实例讲述了Python使用Pickle库实现读写序列操作.分享给大家供大家参考,具体如下: 简介 pickle模块实现了用于对Python对象结构进行序列化和反序列化的二进制协议."Pi ...

  10. python序列操作_序列操作

    [TOC] # 序列操作 ## all:**判断可迭代对象的每个元素是否都为True值** ~~~ >>> all([1,2]) #列表中每个元素逻辑值均为True,返回True T ...

最新文章

  1. OpenCvSharp中CV_8UC1,CV_8UC2等参数的解释
  2. java转成图形界面_【转】java图形界面设计(AWT)
  3. python3连接数据库步骤_Python3连接Mysql8.0遇到的问题及处理步骤
  4. celery-01-异步任务模块-解决发送邮件的延时问题
  5. 【ROS学习笔记】(六)客户端Client的编程实现
  6. Harmony OS — RadioButton RadioContainer单选按钮单选按钮组
  7. Oracle数据库文件中的导入\导出(imp/exp命令)
  8. cactiEZ 配置
  9. 3.2常用的调度算法
  10. 通信专业顶刊_通信方面的期刊_信息与通信工程期刊排行顶级的_通信技术
  11. 8类网线利弊_八类网线用过吗?与超五类、六类等网线有啥区别?
  12. 那些年京东出现的BUG损失惨重,你还敢瞧不起测试?
  13. 日系P2P原理探究(一) — Winny元祖: Freenet
  14. linux dd安装win2003,DD安装win2003,2008系统
  15. JavaEE | 可变参数
  16. ElasticSearch知识概括
  17. 流利阅读 2019.1.24 China’s about to rediscover Peppa Pig
  18. 【R】【课程笔记】04+05 数据预处理+收益率计算
  19. 如何快速将纸质书转成pdf或Word电子档
  20. C++下实现全连接神经网络

热门文章

  1. 框架之---Flask
  2. nginx+iis、NLB、Web Farm、Web Garden、ARR
  3. 浅谈多个社交账号的登录注册设计
  4. wget下载网络图片
  5. 关于EXP-00056: 遇到 ORACLE 错误 1455 ORA-01455: 转换列溢出整数数据类型 EXP-00000: 导出终止失败 的问题解决方法整理...
  6. 查看和修改mysql最大连接数
  7. Emacs学习笔记(8): 使用emacs浏览网页
  8. Java多线程篇之List与Collections集合工具类
  9. vue-router在3.0版本以上重复点击菜单报错的问题
  10. 关于winfrom中如何快速导出DataGridView数据到excel中的问题