这个题卡常数。。

首先c比较小,所以可以考虑dp转移,对于合并子序列就直接枚举跨区间的就可以了

对于反转操作,要注意只有奇数位置才会变成相反数

对于增加操作,可以考虑抽象成组合数学问题:

对于(a1+b)*(a2+b)+(a1+b)*(a3+b)+(a2+b)*(a3+b),拆下来就是每一项都会和不同的两项相乘,

转化到上图上就相当于每组选k个左边的,c-k个右边的,然后组合数学算一下就可以了

码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define P 19940417
#define N 100005
#define zuo o<<1,l,mid
#define you o<<1|1,mid+1,r
int i,j,L[N<<2],R[N<<2],a,b,n,m;
long long lin3[N],lin2[N],lin[N],c,ci[25],ci2[25],jiabj[N<<2],fbj[N<<2],C[N][25],v[N<<2][25];
char op[5];
void up(int o)
{ int ll=o<<1;int rr=o<<1|1;for(int i=1;i<=20;i++){ v[o][i]=0;for(int j=0;j<=i;j++){v[o][i]+=(v[ll][j]*v[rr][i-j])%P;}v[o][i]%=P;}
}
void jian(int o,int l,int r)
{L[o]=l;R[o]=r;v[o][0]=1;if(l==r){v[o][1]=lin[l];return;       }int mid=(l+r)>>1; jian(zuo);jian(you);up(o);
}
void push(int o)
{int i,j;int ll=o<<1,rr=o<<1|1;
if(fbj[o])
{fbj[o]=0;fbj[ll]^=1;fbj[rr]^=1;jiabj[ll]*=-1,jiabj[rr]*=-1;for(i=1;i<=20;i++)if(i&1)v[ll][i]*=-1,v[rr][i]*=-1;
}if(jiabj[o]!=0){
for(i=1;i<=20;i++)ci2[i]=(ci2[i-1]*jiabj[o])%P;
for(i=1;i<=20;i++)
for(j=0;j<=i;j++)if(R[ll]-L[ll]+1-j>=0)lin[i]=(lin[i]+v[ll][j]*C[R[ll]-L[ll]+1-j][i-j]%P*ci2[i-j]%P)%P;for(i=1;i<=20;i++)v[ll][i]=lin[i],lin[i]=0;
jiabj[ll]+=jiabj[o];
jiabj[ll]%=P;
for(i=1;i<=20;i++)
for(j=0;j<=i;j++)
if(R[rr]-L[rr]+1-j>=0)lin[i]=(lin[i]+v[rr][j]*C[R[rr]-L[rr]+1-j][i-j]%P*ci2[i-j]%P)%P;for(i=1;i<=20;i++)v[rr][i]=lin[i],lin[i]=0;
jiabj[rr]+=jiabj[o];
jiabj[rr]%=P;
jiabj[o]=0;     }
}
void gai(int o,int l,int r)
{if(a<=l&&r<=b){int i,j;if(op[0]=='Q'){for(i=1;i<=c;i++)for(j=0;j<=i;j++)lin2[i]+=v[o][j]*lin3[i-j],lin2[i]%=P;for(i=1;i<=c;i++)lin3[i]=lin2[i],lin2[i]=0;}if(op[0]=='R'){   jiabj[o]*=-1;for(i=1;i<=20;i++)if(i&1)v[o][i]*=-1;fbj[o]^=1;}if(op[0]=='I'){for(i=1;i<=20;i++)
for(j=0;j<=i;j++)
if(R[o]-L[o]+1-j>=0)lin[i]=(lin[i]+v[o][j]*C[R[o]-L[o]+1-j][i-j]%P*ci[i-j]%P)%P;for(i=1;i<=20;i++)v[o][i]=lin[i],lin[i]=0;
jiabj[o]+=c;jiabj[o]%=P;    }   return ;    }push(o);int mid=(l+r)>>1;if(a<=mid)gai(zuo);if(b>mid)gai(you);up(o);
}
long long  duru()
{long long x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
int main()
{ci2[0]=1;
C[0][0]=1;scanf("%d%d",&n,&m);for(j=1;j<=n;j++){C[j][0]=1;for(i=1;i<=20;i++)C[j][i]=(C[j-1][i-1]+C[j-1][i])%P;
}for(i=1;i<=n;i++){lin[i]=duru();  }jian(1,1,n);memset(lin,0,sizeof(lin));while(m--){scanf("%s",&op);if(op[0]=='I'){a=duru();b=duru();c=duru();ci[0]=1;for(i=1;i<=20;i++){   ci[i]=(ci[i-1]*c)%P;                 }gai(1,1,n);  for(i=1;i<=20;i++)lin[i]=0;     }if(op[0]=='R'){ a=duru();b=duru();gai(1,1,n);for(i=1;i<=20;i++)lin[i]=0;}if(op[0]=='Q'){a=duru();b=duru();c=duru();lin3[0]=lin[0]=1;gai(1,1,n);printf("%lld\n",(lin3[c]+P)%P);for(i=1;i<=20;i++)lin3[i]=lin[i]=0;}}
}

bzoj 2962 序列操作 线段树相关推荐

  1. bzoj 2962 序列操作

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

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

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

  3. BZOJ1858 [Scoi2010]序列操作 线段树

    欢迎访问~原文出处--博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1858 题意概括 lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1 ...

  4. Luogu P2572 [SCOI2010]序列操作 线段树。。

    咕咕了...于是借鉴了小粉兔的做法ORZ... 其实就是维护最大子段和的线段树,但上面又多了一些操作....QWQ 维护8个信息:1/0的个数(sum),左/右边起1/0的最长长度(ls,rs),整段 ...

  5. BZOJ.1558.[JSOI2009]等差数列(线段树 差分)

    BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...

  6. Wannafly挑战赛22 D 整数序列 (线段树维护三角函数值)

    链接:https://ac.nowcoder.com/acm/contest/160/D 来源:牛客网 整数序列 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语 ...

  7. BZOJ_1798__Codevs_2216_[AHOI_2009]_行星序列_(线段树)

    描述 BZOJ: http://www.lydsy.com/JudgeOnline/problem.php?id=1798 Codevs: http://codevs.cn/problem/2216/ ...

  8. BZOJ 2124 等差子序列 线段树维护哈希

    $ \Rightarrow $ 戳我进BZOJ原题 等差子序列 Time Limit: 3 Sec $ \quad $ Memory Limit: 259 MB Description 给一个 $ 1 ...

  9. 2020-2021年度第二届全国大学生算法设计与编程挑战赛 (春季赛)- 天才的操作(线段树+主席树+树上倍增)

    题目链接:点击查看 题目分析:刚看到这个题目的时候,口胡了一个假算法,觉得对于每次询问的操作 [l,r][l,r][l,r] ,只需要找到指令集区间 [l,r][l,r][l,r] 内覆盖到点 kkk ...

最新文章

  1. 信号相参性(相干性)(转)
  2. 2013 多校联合4 1011 Fliping game (hdu 4642)
  3. python统计字典里面value出现的次数_python统计字典中元素出现的次数
  4. 奇虎360大战腾讯QQ 高潮迭起用户受伤
  5. fastadmin token 验证错误_用签名保护你的隐私(4)--token生成
  6. mysql索引与事务笔记_《MySQL技术内幕:InnoDB存储引擎》读书笔记五-锁、索引及事务...
  7. 嵌入式系统——存储管理方案
  8. 选择部门-选择员工(js)
  9. ubuntu 串口调试助手
  10. jq多选按钮值_JQuery 多选按钮checkbox
  11. 京东举办首届大数据峰会 打造智能零售大数据“操作系统”
  12. @Transactional的readOnly、timeout
  13. Android 小米计算器,小米计算器app_小米计算器安卓版_小米计算器正式_易玩网
  14. python关于列表去重和删除的方法
  15. Spark开发实用技巧-从入门到爱不释手
  16. 市场调研报告-全球与中国熔接器市场现状及未来发展趋势
  17. 计算机病毒教学评课,计算机病毒评课稿.doc
  18. C#图片加载与内存释放
  19. servlet+javabean+jdbc+mysql基于MVC模式的课件管理系统,有三个表的增删改查和课件搜索、课件上传、课件下载功能, 具体功能请看界面上的导航条
  20. 文献阅读:Scaling Instruction-Finetuned Language Models

热门文章

  1. numpy版本过高的解决方案
  2. 高等组合学笔记(一)集合的计数,映射与集合的排列组合
  3. selenium自动化案例(一)B站专栏爬虫
  4. 【李宏毅机器学习】Why Deep Learning(p15) 学习笔记
  5. poj 2253 最短路变形——最大边的最小值
  6. Jetson AGX Xavier配置PyTorch与TorchVision流程
  7. iphone悬浮球怎么设置_OPPO手机怎么截屏?大部分的人只会两种,包括你吗?
  8. springboot 多数据源_SpringBoot整合多数据源的巨坑一
  9. html5画布页面,HTML5 界面元素 Canvas 参考手册
  10. 计算机的网络默认下拉列表出不来,网页下拉菜单打不开,怎么解决?