[loj3247]Non-Decreasing Subsequences
分治,考虑分治到[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的更多相关文章
- CF502C The Phone Number
C. The Phone Number time limit per test 1 second memory limit per test 256 megabytes Mrs. Smith ...
- CodeForces - 1017 C. The Phone Number(数学)
Mrs. Smith is trying to contact her husband, John Smith, but she forgot the secret phone number! The ...
- cf 1017C
C. The Phone Number time limit per test 1 second memory limit per test 256 megabytes input standard ...
- codeforces 597C C. Subsequences(dp+树状数组)
题目链接: C. Subsequences time limit per test 1 second memory limit per test 256 megabytes input standar ...
- [LeetCode] Distinct Subsequences 不同的子序列
Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequence ...
- Distinct Subsequences
https://leetcode.com/problems/distinct-subsequences/ Given a string S and a string T, count the numb ...
- HDU 2227 Find the nondecreasing subsequences (DP+树状数组+离散化)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2227 Find the nondecreasing subsequences ...
- Leetcode Distinct Subsequences
Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequence ...
- LeetCode(115) Distinct Subsequences
题目 Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequen ...
随机推荐
- 『Mivik的萌新赛 & Chino的比赛 2020』T2 题解 Galgame
如果这是我最后一篇题解,请每年为我上坟. Galgame 题目传送门 Decription as_lky 搞到了很多 Galgame(真的很多!).一款 Galgame 可以被描述为很多场景(Scen ...
- 洛谷4400 BlueMary的旅行(分层图+最大流)
qwq 首先,我们观察到题目中提到的每天只能乘坐一次航班的限制,很容易想到建分层图,也就是通过枚举天数,然后每天加入一层新的点. (然而我一开始想的却是erf) 考虑从小到大枚举天数,然后每次新建一层 ...
- 保护模式篇——PAE分页
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...
- [软工顶级理解组] Beta阶段测试报告
在测试过程中发现了多少Bug? 测试阶段发现并已修复的bug: 尚且存在,但是难以解决或者不影响使用的bug: 计算重修课程的时候,如果重修课程的课程号和原课程号不同,则GPA计算会出现误差.但我们无 ...
- 【二食堂】Alpha - Scrum Meeting 1
Scrum Meeting 1 例会时间:4.10 8:00 - 8:30 进度情况 组员 上周进度 明日任务 李健 1. 在Anaconda3中搭建了python和django的环境issue1. ...
- 上拉电阻大小对i2c总线的影响
漏极开路上拉电阻取值为何不能很大或很小? 如果上拉电阻值过小,Vcc灌入端口的电流(Ic)将较大,这样会导致MOS管V2(三极管)不完全导通(Ib*β<Ic),有饱和状态变成放大状态,这样端口输 ...
- C语言单片机项目实战超声波雷达测距
本实验是基于MSP430利用HC-SR04超声波传感器进行测距,测距范围是3-65cm,讲得到的数据显示在LCD 1602液晶屏上. 模块工作原理如下 (1)采用 IO 触发测距,给至少 10us 的 ...
- 洛谷 P3147 [USACO16OPEN]262144 P
链接: P3147 P3146双倍经验 前言: 今天发现的一道很有意思的DP题 分析: 第一眼以为是区间DP,于是设f[i][j]为从第i个数到第j个数可以合出的最大值,但思考后发现并不能简单合并,并 ...
- 神经网络 感知机 Perceptron python实现
import numpy as np import matplotlib.pyplot as plt import math def create_data(w1=3,w2=-7,b=4,seed=1 ...
- best-time-to-buy-and-sell-stock-ii leetcode C++
Say you have an array for which the i th element is the price of a given stock on day i. Design an a ...