分治,考虑分治到[l,r]的区间(设$mid=(l+r)/2$),将询问分为两类:
1.在左/右区间,直接递归下去;
2.跨越中间,那么处理出两个数组:L[i][j]表示左区间在开头第i个位置,以数字j为结尾的上升子序列个数(不跨越mid),右区间同理
(L和R的计算很简单,只需要再处理出一个L[i][j][k]表示i后面以j为开头,以k为结尾的子序列个数即可)
对其求前/后缀和,那么就求出了开头在第i个位置以后/结尾在第i个位置以前的子序列个数
设询问区间为[x,y],那么答案就是$\sum_{i=1}^{20}L[x][i]+R[y][i]+L[x][i]\sum_{j=i}^{20}R[y][j]$,注意取模

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 200005
4 #define mid (l+r>>1)
5 #define mod 1000000007
6 struct ji{
7 int l,r,id;
8 }q[N];
9 int n,m,a[N],ans[N],f[N][21],ff[N][21][21],g[N][21],gg[N][21][21],sum[N][22];
10 void dfs(int l,int r,int x,int y){
11 if (l==r){
12 for(int i=x;i<=y;i++)ans[q[i].id]=1;
13 return;
14 }
15 int p=x;
16 for(int i=x;i<=y;i++)
17 if (q[i].r<=mid)swap(q[p++],q[i]);
18 dfs(l,mid,x,p-1);
19 x=p;
20 for(int i=x;i<=y;i++)
21 if (mid<q[i].l)swap(q[p++],q[i]);
22 dfs(mid+1,r,x,p-1);
23 x=p;
24 memset(f[mid],0,sizeof(f[mid]));
25 memset(ff[mid],0,sizeof(ff[mid]));
26 memset(g[mid],0,sizeof(g[mid]));
27 memset(gg[mid],0,sizeof(gg[mid]));
28 ff[mid][a[mid]][a[mid]]=f[mid][a[mid]]=1;
29 for(int i=mid-1;i>=l;i--)
30 for(int j=1;j<=20;j++){
31 f[i][j]=0;
32 for(int k=1;k<=j;k++){
33 ff[i][j][k]=ff[i+1][j][k];
34 if (k==a[i]){
35 if (j==k)ff[i][j][k]++;
36 for(int t=k;t<=20;t++)ff[i][j][k]=(ff[i][j][k]+ff[i+1][j][t])%mod;
37 }
38 f[i][j]=(f[i][j]+ff[i][j][k])%mod;
39 }
40 }
41 gg[mid+1][a[mid+1]][a[mid+1]]=g[mid+1][a[mid+1]]=1;
42 for(int i=mid+2;i<=r;i++)
43 for(int j=1;j<=20;j++){
44 g[i][j]=0;
45 for(int k=j;k<=20;k++){
46 gg[i][j][k]=gg[i-1][j][k];
47 if (k==a[i]){
48 if (j==k)gg[i][j][k]++;
49 for(int t=1;t<=k;t++)gg[i][j][k]=(gg[i][j][k]+gg[i-1][j][t])%mod;
50 }
51 g[i][j]=(g[i][j]+gg[i][j][k])%mod;
52 }
53 }
54 for(int i=mid+1;i<=r;i++)
55 for(int j=20;j;j--)sum[i][j]=(sum[i][j+1]+g[i][j])%mod;
56 for(int i=x;i<=y;i++)
57 for(int j=1;j<=20;j++)
58 ans[q[i].id]=(ans[q[i].id]+f[q[i].l][j]*(1LL+sum[q[i].r][j])+g[q[i].r][j])%mod;
59 }
60 int main(){
61 scanf("%d%*d",&n);
62 for(int i=1;i<=n;i++)scanf("%d",&a[i]);
63 scanf("%d",&m);
64 for(int i=1;i<=m;i++){
65 scanf("%d%d",&q[i].l,&q[i].r);
66 q[i].id=i;
67 }
68 dfs(1,n,1,m);
69 for(int i=1;i<=m;i++)printf("%d\n",(ans[i]+1)%mod);
70 }

[loj3247]Non-Decreasing Subsequences的更多相关文章

  1. CF502C The Phone Number

    C. The Phone Number time limit per test 1 second memory limit per test 256 megabytes     Mrs. Smith ...

  2. CodeForces - 1017 C. The Phone Number(数学)

    Mrs. Smith is trying to contact her husband, John Smith, but she forgot the secret phone number! The ...

  3. cf 1017C

    C. The Phone Number time limit per test 1 second memory limit per test 256 megabytes input standard ...

  4. codeforces 597C C. Subsequences(dp+树状数组)

    题目链接: C. Subsequences time limit per test 1 second memory limit per test 256 megabytes input standar ...

  5. [LeetCode] Distinct Subsequences 不同的子序列

    Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequence ...

  6. Distinct Subsequences

    https://leetcode.com/problems/distinct-subsequences/ Given a string S and a string T, count the numb ...

  7. HDU 2227 Find the nondecreasing subsequences (DP+树状数组+离散化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2227 Find the nondecreasing subsequences             ...

  8. Leetcode Distinct Subsequences

    Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequence ...

  9. LeetCode(115) Distinct Subsequences

    题目 Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequen ...

随机推荐

  1. 洛谷2900 [USACO08MAR]土地征用Land Acquisition (斜率优化+dp)

    自闭的一批....为什么斜率优化能这么自闭. 首先看到这个题的第一想法一定是按照一个维度进行排序. 那我们不妨直接按照\(h_i\)排序. 我们令\(dp[i]\)表示到了第\(i\)个矩形的答案是多 ...

  2. SpringBoot配置文件-多环境切换

    profile是Spring对不同环境提供不同配置功能的支持,可以通过激活不同的环境版本,实现快速切换环境: 多个文件-配置多环境: 需要多个配置文件,文件名可以是 application-{prof ...

  3. Arp欺骗和DNS投毒的实验性分析

    1.中间人攻击之Arp欺骗/毒化 本文涉及网络安全攻击知识,随时可能被永久删除.请Star我的GitHub仓库 实现原理: 这种攻击手段也叫做中间人攻击MITM(Man-in-the-Middle) ...

  4. Linux argc,argv详解

    来源:微信公众号「编程学习基地」 @ 目录 argc,argv是什么 如何解析程序参数 "选项"是什么? "选项字符串"是什么 解析参数 argc,argv是什 ...

  5. Egg.js学习与实战系列 · 文件上传配置

    在使用Egg.js搭建文件上传服务时,遇到了几个一般新手都会遇到的坑. 经查阅官方文档,Egg框架中默认使用egg-multipart插件进行文件上传,所以上传文件前需要做相关的配置. 上传文件提示: ...

  6. 占位符,SQL注入?

    这两天在上课时被同学拿了一段代码问我,这段代码有什么问题,我看了一会说:Connection和PreparedStatement都没关.他说不止这方面的问题,还有sql注入的问题,我就坚决的说使用了占 ...

  7. Beta阶段第五次会议

    Beta阶段第五次会议 时间:2020.5.21 完成工作 姓名 工作 难度 完成度 ltx 1.对小程序进行修改和美化新增页面(新增60行) 中 85% xyq 1.编写技术博客 中 85% xtl ...

  8. 2021.8.17考试总结[NOIP42]

    $\huge{取模不能比大小!}$ $\huge{取模不能比大小!}$ $\huge{取模不能比大小!}$ 有了打地鼠的前车之鉴,我深信树规板子是可以出现在联赛题里的. 所以T1十分钟码完直接溜了,后 ...

  9. Python课程笔记(二)

    1.格式化输出 print("%d %d %s" % (15, 3.14, 12.8)) 对比C语言 printf("%d,%d,%s",15, 3.14, 1 ...

  10. Java:final,finally 和 finalize 的区别

    在Java中,final,final和finalize之间有许多差异.final,final和finalize之间的差异列表如下: No final finally finalize 1 final用 ...