分治,考虑分治到[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. javascript-原生-结构

    1.获取用户输入内容的方法 window.prompt("提示信息","默认值"); 获取用户输入内容(字符串类型),返回用户输入内容. 2.顺序结构:所有语句 ...

  2. 【UE4 设计模式】单例模式 Singleton Pattern

    概述 描述 保证一个类只有一个实例 提供一个访问该实例的全局节点,可以视为一个全局变量 仅在首次请求单例对象时对其进行初始化. 套路 将默认构造函数设为私有, 防止其他对象使用单例类的 new运算符. ...

  3. 在浏览器上开发GO和Vue!(基于code-server)

    在浏览器上开发GO和Vue!(基于code-server) 曾几何时,开发者们都被安装编程环境苦恼,尽管现在很多语言的开发环境已经不难装了,但是如果我们能有一个运行在云端的编译器,那么我们就可以随时随 ...

  4. Noip模拟81 2021.10.20

    T1 语言 比较简单的题,然后就瞎写了,所以考场上就我一个写了线段树的,所以我的常数.... 所以就枚举动词的位置,找前面后面有没有出现$4$即可 1 #include<bits/stdc++. ...

  5. Noip模拟44 2021.8.19

    比较惊人的排行榜 更不用说爆零的人数了,为什么联赛会这么难!!害怕了 还要再努力鸭 T1 Emotional Flutter 考场上没切掉的神仙题 考率如何贪心,我们把黑色的条延长$s$,白色的缩短$ ...

  6. https的加密解密过程

    前置知识 SSL是90年代Netscape弄出来的一套东西,为的是解决HTTP协议明文传输数据的问题.后来SSL慢慢成了事实上的标准,于是IETF就把SSL标准化了,名字叫做TLS,TLS 1.0其实 ...

  7. 从零开始的DIY智能家居 - 基于 ESP32 的智能浇水器

    前言 上次 土壤湿度传感器 完成之后,就立下一个 flag 要搭建一个智慧浇水的智能场景,现在终于有时间填坑了!(o゚▽゚)o 智慧浇水场景的核心设备有三个: 检测土壤状态的:土壤湿度传感器 通过这个 ...

  8. 最后的OI(HAOI2020游记)

    马上就省选了,怎么不得写点什么?要不然到最后或许就真的落得个白茫茫大地真干净的局面. 其实也不知道该说啥?我这一路走来,感觉挺赚的. 每一个OIer背后都有一个故事,所以,我有故事,你有酒吗? 依稀记 ...

  9. 第11课 OpenGL 飘动的旗帜

    飘动的旗帜: 这一课从第六课的代码开始,创建一个飘动的旗帜.我相信在这课结束的时候,你可以掌握纹理映射和混合操作. 大家好!对那些想知道我在这里作了些什么的朋友,您可以先按文章的末尾所列出的链接,下载 ...

  10. 接口自动化 - pytest-fixture -scope作用范围

            接口自动化-pytest中的fixture - scope                介绍 fixture文章中介绍的比较少,同学们可以去搜索下fixture的详解或者去看看源码 ...