CCPC-Wannafly Winter Camp Day1 (Div2, onsite) - I 起起落落
题目描述
无聊的wlswls正在观察某个商品的价格,wlswls一共观察了nn天,每天这个商品都会有一个价格p_ipi。
定义一个长度为2m+1(3\leq2m+1\leq n)2m+1(3≤2m+1≤n)的子序列a_1...a_{2m+1}a1...a2m+1是持续下降的,当且仅当:
1 \leq a_1 < a_2 < .... < a_{2m+1} \leq n1≤a1<a2<....<a2m+1≤n
对于所有的k(1 \leq k \leq m)k(1≤k≤m), p_{a[2k - 1]} > p_{a[2k + 1]} > p_{a[2k]}pa[2k−1]>pa[2k+1]>pa[2k]
现在wlswls想知道持续下降的子序列一共有多少个。
由于满足条件的序列可能很多,请输出答案 modmod 1e9+71e9+7。
输入描述
第一行一个整数nn。
接下来一行nn个整数,p_ipi表示商品第ii天的价格。
1 \leq n \leq 20001≤n≤2000
1 \leq p_i \leq n1≤pi≤n
p_i \neq p_jpi=pj
输出描述
一行一个整数表示答案。
样例输入 1
5
4 2 3 1 5
样例输出 1
1 思路:
我们先来看三个元素组成的持续下降的子序列,
如x,y,z, 那么要求 x>z>y (因为没有相等的两个价值,所以不考虑等于号)
那么我们想一下,如果我们只找三个元素组成的子序列,咋找呢?
我们可以定义dp状态 dp[i] 表示 以第i个元素为结尾的合法子序列个数。
那么我们可以n*n的方式去找,
对于每一个i,我们枚举j=i-1 downto 1 ,维护比a[i] 小的数 的个数 k,
在枚举的过程中,我们遇到一个数a[j] >a[i] 时,我们可以对dp[i] += k ;
为什么? 因为 这个 a[j] 可以和到a[i]中间的那k个比a[i]小的构成三元素合法子序列。
这样我们就解决了三元素合法子序列的问题,
题目要求的并不是三元素子序列,是2*m+1 元素的,三元素只是m=1的情况,。
那么我们不妨来看一下 m=2时。即5个元素的情况,
我们应该知道 5个元素的情况只是在三元素情况上后面加两个数字 q w
构成 x>z>y,z>w>q
观察可得,5元组的第2个大小关系中的最大值,是上一个三元组中的 z,
那么当我们再求第5个元素w的 dp[i]的时候(i是 w的下标 ),我们遇到z的时候,
dp[i]+= (dp[j]+1)*k;
j是比w大的元素z的下标,这样就可以把以z为结尾的所有合法子序列又都贡献到了 dp[i]上,
这样我们就可以n*n的时间复杂度来用dp解决这个问题。 细节见代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define rt return
#define dll(x) scanf("%I64d",&x)
#define xll(x) printf("%I64d\n",x)
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define db(x) cout<<"== [ "<<x<<" ] =="<<endl;
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;}
ll lcm(ll a, ll b) {return a / gcd(a, b) * b;}
ll powmod(ll a, ll b, ll MOD) {ll ans = ; while (b) {if (b % )ans = ans * a % MOD; a = a * a % MOD; b /= ;} return ans;}
inline void getInt(int* p);
const int maxn = ;
const int inf = 0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
const ll mod = 1e9 + ;
ll n;
ll a[maxn];
ll dp[maxn];
int main()
{
//freopen("D:\\common_text\\code_stream\\in.txt","r",stdin);
//freopen("D:\\common_text\\code_stream\\out.txt","w",stdout);
gbtb;
cin >> n;
repd(i, , n)
{
cin >> a[i];
}
ll k;
repd(j, , n)
{
k = 0ll;
for (int i = j - ; i >= ; i--)
{
if (a[i] < a[j])
{
k++;
} else
{
dp[j] += (dp[i] + ) * k;
dp[j] %= mod;
}
} }
ll ans = 0ll;
repd(i, , n)
{
ans = (ans + dp[i]) % mod;
}
ans %= mod;
cout << ans << endl; return ;
} inline void getInt(int* p) {
char ch;
do {
ch = getchar();
} while (ch == ' ' || ch == '\n');
if (ch == '-') {
*p = -(getchar() - '');
while ((ch = getchar()) >= '' && ch <= '') {
*p = *p * - ch + '';
}
}
else {
*p = ch - '';
while ((ch = getchar()) >= '' && ch <= '') {
*p = *p * + ch - '';
}
}
}
CCPC-Wannafly Winter Camp Day1 (Div2, onsite) - I 起起落落的更多相关文章
- 2020 CCPC Wannafly Winter Camp Day1 C. 染色图
2020 CCPC Wannafly Winter Camp Day1 C. 染色图 定义一张无向图 G=⟨V,E⟩ 是 k 可染色的当且仅当存在函数 f:V↦{1,2,⋯,k} 满足对于 G 中的任 ...
- 2019 CCPC-Wannafly Winter Camp Day1 (Div2, onsite)
solve:4/11 补题:6/11 A 机器人 补题:zz 这是一道分类讨论的题目,有一个规律就是如果必须要从第一个区到第二个区,那么最多转区两次(1到2一次,2到1一次),然后分类讨论即可,只要细 ...
- CCPC-Wannafly Winter Camp Day1 (Div2, onsite) A B C E F I J
A 机器人 链接:https://www.cometoj.com/contest/7/problem/A?problem_id=92 思路: 分两大类讨论: 1. B区没有点: (1)点都在起点左边 ...
- CCPC-Wannafly Winter Camp Day1 (Div2, onsite)
Replay Dup4: 要是不挂机,再多仔细想想就好了 J确实自闭好久,一直在想正确性,最后数据错了,喵喵喵? 还是要保证充足的休息啊,中间睡了一小会儿,也不知道睡了多久,醒来他们就又过了一道 要发 ...
- CCPC-Wannafly Winter Camp Day1 (Div2, onsite) 夺宝奇兵
题目描述 wlswls所在的王国有nn个居民(不包括wlswls),他们共有mm件神奇的宝物. 对于第ii件宝物,wlswls可以花费a_iai的金币把它从原来的主人那里买过来. 请问wlswls最 ...
- 2020 CCPC Wannafly Winter Camp Day1 Div.1& F
#include<bits/stdc++.h> #define forn(i, n) for (int i = 0; i < int(n); i++) #define fore(i, ...
- 2020 CCPC Wannafly Winter Camp Day1 - I. K小数查询(分块)
题目链接:K小数查询 题意:给你一个长度为$n$序列$A$,有$m$个操作,操作分为两种: 输入$x,y,c$,表示对$i\in[x,y] $,令$A_{i}=min(A_{i},c)$ 输入$x,y ...
- CCPC-Wannafly Winter Camp Day1 (Div2 ABCFJ) 待补...
Day1 Div2 场外链接 按题目顺序~ A 机器人 传送门 题意:有两条平行直线A.B,每条直线上有n个点,编号为1~n.在同一直线上,从a站点到b站点耗时为两点间的距离.存在m个特殊站点,只有在 ...
- CCPC Wannafly Winter Camp Div2 部分题解
Day 1, Div 2, Prob. B - 吃豆豆 题目大意 wls有一个\(n\)行\(m\)列的棋盘,对于第\(i\)行第\(j\)列的格子,每过\(T[i][j]\)秒会在上面出现一个糖果, ...
随机推荐
- Java九种基本数据类型,以及他们的封装类
基本类型 大小(字节) 默认值 封装类 byte 1 (byte)0 Byte short 2 (short)0 Short int 4 0 Integer long 8 0L Long float ...
- debian配置国内软件源
本例在debian:buster-slim docker镜像中实验通过 1.启动docker实例 docker run -it --name debian debian:buster-slim bas ...
- sklearn—支持向量机
SVC介绍: 拟合出来的模型为一个超平面 解决与样本维数无关,适合做文本分类 解决小样本.非线性.高维 是用于分类.回归.孤立点检测的监督学习方法的集合. 优点: 有效的高维空间 维数大于样本数的时候 ...
- 九、设置RF自定义的日志输出路径
在Arguments输入-d E:\\robot,每次运行完都会发送该目录日志
- 图解http协议学习笔记
一 ,基本概念 1互联网相关的各协议族为tcp/ip协议(网际协议),tcp/ip ftp,DNS(通过域名解析ip地址),http(超文本传输协议) 还有很多协议 ,只是列举比较熟悉的 2tcp/ ...
- day66—angularJS学习笔记-表达式
转行学开发,代码100天——2018-05-21 angular的变量数据初始化: ng-init="quantity=1;cost=30;student={firstName:'李',la ...
- ES6标准入门 第四章:字符串的扩展
1.字符串的Unicode 表示法 JavaScript 允许采用 \uxxxx 表示一个字符,其中 xxxx 表示字符的码点. "\u0061" // "a" ...
- ES6标准入门 第三章:变量的解构赋值
解构赋值:从数组和对象中提取值,对变量进行赋值. 本质上,这种写法属于“匹配模式”:只要等号两边的模式相同,左边的变量就会被赋予对应的值. 1.数组的结解构赋值 基本用法 let [foo, [[ba ...
- 安装iamp模块,编译报错configure: error: Cannot find imap library (libc-client.a). Please check your c-client installation.
yum install libc-client-devel cd /root/lnmp1.0-full/php-5.3.17/ext/imap /usr/local/php/bin/phpize ./ ...
- 初学node.js-nodejs中实现用户登录路由
经过前面几次的学习,已经可以做下小功能,今天要实现的事用户登录路由. 一.users_model.js 功能:定义用户对象模型 var mongoose=require('mongoose'), S ...