bzoj 2962 序列操作
2962: 序列操作
Time Limit: 50 Sec Memory Limit: 256 MB
[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
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
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
我写的题解看这里的T2
http://www.cnblogs.com/TheRoadToTheGold/p/7723564.html
网上的参考题解
http://blog.csdn.net/werkeytom_ftd/article/details/51767696
#include<cstdio>
#include<iostream>
#include<algorithm> using namespace std; #define N 50001 const int mod=; typedef long long LL; int n; int C[N][]; int f[N<<];
int siz[N<<],mid[N<<];
bool rev[N<<]; struct node { int sum[]; }ans[N<<]; void read(int &x)
{
x=; int ff=; char c=getchar();
while(!isdigit(c)) { if(c=='-') ff=-; c=getchar(); }
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
x*=ff;
} int tot=; void MOD(int &a,int b)
{
a+=b;
a-= a>=mod ? mod : ;
} void pre(int n)
{
C[][]=;
for(int i=;i<=n;i++)
{
C[i][]=;
for(int j=;j<=min(i,);j++) C[i][j]=(C[i-][j]+C[i-][j-])%mod;
}
} void update(int k)
{
for(int i=;i<=;i++)
{
ans[k].sum[i]=;
for(int j=;j<i;j++) MOD(ans[k].sum[i],1ll*ans[k<<].sum[j]*ans[k<<|].sum[i-j]%mod);
MOD(ans[k].sum[i],ans[k<<].sum[i]); MOD(ans[k].sum[i],ans[k<<|].sum[i]);
}
} void build(int k,int l,int r)
{
siz[k]=r-l+;
if(l==r) { read(ans[k].sum[]); MOD(ans[k].sum[],); return; }
mid[k]=l+r>>;
build(k<<,l,mid[k]); build(k<<|,mid[k]+,r);
update(k);
} void insert(int k,int w)
{
MOD(f[k],w);
for(int i=;i;i--)
{
int x=w;
for(int j=i-;j;j--,x=1ll*x*w%mod)
MOD(ans[k].sum[i],1ll*x*ans[k].sum[j]%mod*C[siz[k]-j][i-j]%mod);
MOD(ans[k].sum[i],1ll*x*C[siz[k]][i]%mod);
}
} void turn(int k)
{
rev[k]^=;
if(f[k]) f[k]=mod-f[k];
for(int i=;i>;i-=)
if(ans[k].sum[i]) ans[k].sum[i]=mod-ans[k].sum[i];
} void down(int k)
{
if(rev[k]) turn(k<<),turn(k<<|),rev[k]=;
if(f[k]) insert(k<<,f[k]),insert(k<<|,f[k]),f[k]=;
} void add(int k,int l,int r,int opl,int opr,int w)
{
if(l>=opl && r<=opr) { insert(k,w); return; }
down(k);
if(opl<=mid[k]) add(k<<,l,mid[k],opl,opr,w);
if(opr>mid[k]) add(k<<|,mid[k]+,r,opl,opr,w);
update(k);
} void reverse(int k,int l,int r,int opl,int opr)
{
if(l>=opl && r<=opr) { turn(k); return; }
down(k);
if(opl<=mid[k]) reverse(k<<,l,mid[k],opl,opr);
if(opr>mid[k]) reverse(k<<|,mid[k]+,r,opl,opr);
update(k);
} node query(int k,int l,int r,int opl,int opr,int w)
{
if(l>=opl && r<=opr) return ans[k];
down(k);
if(opr<=mid[k]) return query(k<<,l,mid[k],opl,opr,w);
else if(opl>mid[k]) return query(k<<|,mid[k]+,r,opl,opr,w);
else
{
node L=query(k<<,l,mid[k],opl,opr,w),R=query(k<<|,mid[k]+,r,opl,opr,w);
node tmp;
for(int i=;i<=w;i++)
{
tmp.sum[i]=(L.sum[i]+R.sum[i])%mod;
for(int j=;j<i;j++) MOD(tmp.sum[i],1ll*L.sum[j]*R.sum[i-j]%mod);
}
return tmp;
}
} int main()
{
int n,m; char c[];
read(n); read(m);
pre(n);
build(,,n);
int l,r,w;
while(m--)
{
scanf("%s",c); read(l); read(r);
if(c[]=='I')
{
read(w); w%=mod;
w+= w< ? mod : ;
add(,,n,l,r,w);
}
else if(c[]=='R') reverse(,,n,l,r);
else
{
read(w);
node p=query(,,n,l,r,w);
printf("%d\n",query(,,n,l,r,w).sum[w]);
}
}
}
bzoj 2962 序列操作的更多相关文章
- [bzoj]2962序列操作
[bzoj]2962序列操作 标签: 线段树 题目链接 题意 给你一串序列,要你维护三个操作: 1.区间加法 2.区间取相反数 3.区间内任意选k个数相乘的积 题解 第三个操作看起来一脸懵逼啊. 其实 ...
- bzoj 2962 序列操作——线段树(卷积?)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2962 如果 _,_,_,…… 变成了 (_+k),(_+k),(_+k),…… ,计算就是在 ...
- bzoj 2962 序列操作 —— 线段树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2962 维护 sum[i] 表示选 i 个的乘积和,合并两个子树就枚举两边选多少,乘起来即可: ...
- bzoj 1858 序列操作
bzoj 1858 序列操作 带有随机多个区间单值覆盖的区间操作题,可考虑用珂朵莉树解决. #include<bits/stdc++.h> using namespace std; #de ...
- 【BZOJ-2962】序列操作 线段树 + 区间卷积
2962: 序列操作 Time Limit: 50 Sec Memory Limit: 256 MBSubmit: 678 Solved: 246[Submit][Status][Discuss] ...
- BZOJ 2962
2962: 序列操作 Time Limit: 50 Sec Memory Limit: 256 MBSubmit: 618 Solved: 225[Submit][Status][Discuss] ...
- bzoj2962 序列操作
2962: 序列操作 Time Limit: 50 Sec Memory Limit: 256 MBSubmit: 1145 Solved: 378[Submit][Status][Discuss ...
- (WAWAWAWAWAWA) BZOJ 1858: [Scoi2010]序列操作
二次联通门 : BZOJ 1858: [Scoi2010]序列操作 /* BZOJ 1858: [Scoi2010]序列操作 已经... 没有什么好怕的的了... 16K的代码... 调个MMP啊.. ...
- bzoj 1858: [Scoi2010]序列操作
1858: [Scoi2010]序列操作 Time Limit: 10 Sec Memory Limit: 64 MB 线段树,对于每个区间需要分别维护左右和中间的1和0连续个数,并在op=4时特殊 ...
随机推荐
- Gearman研习笔记(1) ------ 官网介绍要点摘录
之前的项目里使用过消息中间件(公司提供的MQ服务)来做分发,因为MQ是基于消息的,并不是专业的任务分发器,在一些复杂场景上使用起来并不恰当. 后来听组长说了下Gearman(听名字还以为是Ironma ...
- I/HwPointEventFilter: do not support AFT because of no config
I/HwPointEventFilter: do not support AFT because of no config 这是华为对系统做了修改,默认不打印日志,要改配置 在拨号界面输入:以下进入工 ...
- 洛谷P2402 奶牛隐藏(网络流,二分答案,Floyd)
洛谷题目传送门 了解网络流和dinic算法请点这里(感谢SYCstudio) 题目 题目背景 这本是一个非常简单的问题,然而奶牛们由于下雨已经非常混乱,无法完成这一计算,于是这个任务就交给了你.(奶牛 ...
- 【BZOJ1030】文本生成器(AC自动机,动态规划)
[BZOJ1030]文本生成器(AC自动机,动态规划) 题面 BZOJ 题解 超级简单良心送分题 很明显是所有状态-不合法状态 合法状态就是\(26^m\) 不合法状态做一个\(dp\)就好 #inc ...
- 云计算之路-阿里云上:服务器CPU 100%问题是memcached的连接数限制引起的
非常抱歉,昨天的服务器CPU 100%问题是达到 memcached 的连接数限制引起的,不是阿里云服务器的问题. 之前我们用的是阿里云“云数据库 memcached 版”,上个周末我们换成了自己搭建 ...
- Spring Boot初探之restful服务发布
一.背景 Spring boot是集服务发布.数据库管理.日志管理等于一身的服务开发框架:是微服务开发的全能小帮手.这章讲述一下如何使用spring boot发布restful服务接口. 二.搭建基础 ...
- Excel中choose函数的使用方法
你还在为Excel中choose函数的使用方法而苦恼吗,今天小编教你Excel中choose函数的使用方法,让你告别Excel中choose函数的使用方法的烦恼. 经验主要从四方面对Excel函数进行 ...
- linux操作日志:远程登录设置
想要远程linux服务器,首先需要在服务器上开通ssh服务,安装命令如下: sudo apt-get install openssh-server 在上图的提示中,输入“y”,继续等待安装,安装成 ...
- install-scp
centos6 minilize system will not scp command install: yum -y install openssh-clients and another mac ...
- Dell服务器系统安装后无法正常进入系统
问题描述: 正常安装完系统后,重启,出现无法进入系统 问题解决: 此问题出现意味着系统引导项出现错误,进入raid配置里设置相应的所装系统盘为boot引导项: