link。

一个 dp(拜谢 ly)和切入点都略有不同的做法,并不需要观察啥性质。

原问题针对子序列进行规划,自然地想到转而对前缀进行规划。接下来我们考虑一个前缀 \([1, i]\) 以及一个 \(j \in [1, i]\) 对答案的贡献,可以写出 \(\displaystyle \textit{cont}(j \text{ to } [1, i]) = [\max_{i < k} a_k > a_j] \times \text{the number of LISs containing } j \text{ indexed in } [1, i]\)。

这个可以做两个 dp 解决,第一个好解决的静态 dp,即结束在 \(j\) 的 LIS 方案数;第二个 dp 有些烦:\(j\) 在动,我们考虑的前缀 \([1, i]\) 也在移动。

到这里其实换一下着手点第二个 dp 就变成静态的了,即考虑位置 \(j\),直接算 \((j, i)\) 的贡献即可,其中 \(i\) 是「满足 \(a_i > a_j\) 的最大的 \(i\)」。于是我们的第二个 dp 就可以被描述为从 \(j\) 开始,结束在 \(i\) 之前(不包括,因为要保证 \(\max_{i < k} a_k > a_j\))的 LIS 方案数。答案即 \(\displaystyle \sum_{i=1}^n dp_i \times dp'_i\)。

第二个 dp 的具体实现,还需要一个辅助的 dp,其定义是第二个 dp 的定义中去掉贡献范围上界(即 \(i\)),转移画画图就能理解了。

用下 Fenwick Tree 啥的就能 \(O(n \log_2 n)\) 了。

using modint = modint1000000007;
int n, a[200100], pos[200100], id[200100];
modint dp[200100], dp2[200100], dp3[200100], bit[200100], bit2[200100];
void cng(int x, modint w) {
for (; x<=n; x+=x&-x) {
bit[x] += w;
}
}
modint qry(int x) {
modint res = 0;
for (; x; x-=x&-x) {
res += bit[x];
}
return res;
}
void cng2(int x, modint w) {
for (; x<=n; x+=x&-x) {
bit2[x] += w;
}
}
modint qry2(int x) {
modint res = 0;
for (; x; x-=x&-x) {
res += bit2[x];
}
return res;
}
void solve() {
cin >> n;
bastr<int> dsc;
for (int i=1; i<=n; ++i) {
cin >> a[i];
dsc += a[i];
}
sort(dsc.begin(), dsc.end());
dsc.erase(unique(dsc.begin(), dsc.end()), dsc.end());
for (int i=1; i<=n; ++i) {
a[i] = lower_bound(dsc.begin(), dsc.end(), a[i])-dsc.begin()+1;
}
iota(id+1, id+n+1, 1);
sort(id+1, id+n+1, [&](int x, int y) {
return a[x] < a[y];
});
for (int i=1,now=n; i<=n; ++i) {
while (now >= 1 && a[now] <= a[id[i]]) {
now--;
}
pos[id[i]] = now;
}
for (int i=1; i<=n; ++i) {
bit[i] = 0;
}
for (int i=1; i<=n; ++i) {
dp[i] = qry(a[i]-1)+1;
cng(a[i], dp[i]);
}
for (int i=1; i<=n; ++i) {
bit[i] = bit2[i] = 0;
}
modint ans = 0;
for (int i=n; i>=1; --i) {
dp2[i] = qry(cs(dsc)-a[i])+1;
cng(cs(dsc)-a[i]+1, dp2[i]);
if (pos[i] > i) {
dp3[i] = qry(cs(dsc)-a[pos[i]]+1)+qry2(a[pos[i]]-1)-qry2(a[i]);
cng2(a[i], dp3[i]);
}
else {
dp3[i] = 0;
}
ans += dp[i]*dp3[i];
}
cout << ans.val() << "\n";
}

「codeforces - 1621G」Weighted Increasing Subsequences的更多相关文章

  1. 「CodeForces 581D」Three Logos

    BUPT 2017 Summer Training (for 16) #3A 题意 给你三个矩形,需要不重叠不留空地组成一个正方形.不存在输出-1,否则输出边长和这个正方形(A,B,C表示三个不同矩形 ...

  2. 「CodeForces - 50C 」Happy Farm 5 (几何)

    BUPT 2017 summer training (16) #2B 题意 有一些二维直角坐标系上的整数坐标的点,找出严格包含这些点的只能八个方向走出来步数最少的路径,输出最少步数. 题解 这题要求严 ...

  3. 「CodeForces - 598B」Queries on a String

    BUPT 2017 summer training (for 16) #1I 题意 字符串s(1 ≤ |s| ≤ 10 000),有m(1 ≤ m ≤ 300)次操作,每次给l,r,k,代表将r位置插 ...

  4. 「CodeForces - 717E」Paint it really, really dark gray (dfs)

    BUPT 2017 summer training (for 16) #1H 题意 每个节点是黑色or白色,经过一个节点就会改变它的颜色,一开始在1节点.求一条路径使得所有点变成黑色. 题解 dfs时 ...

  5. 「CodeForces 476A」Dreamoon and Stairs

    Dreamoon and Stairs 题意翻译 题面 DM小朋友想要上一个有 \(n\) 级台阶的楼梯.他每一步可以上 \(1\) 或 \(2\) 级台阶.假设他走上这个台阶一共用了 \(x\) 步 ...

  6. 「CodeForces 546B」Soldier and Badges 解题报告

    CF546B Soldier and Badges 题意翻译 给 n 个数,每次操作可以将一个数 +1,要使这 n 个数都不相同, 求最少要加多少? \(1 \le n \le 3000\) 感谢@凉 ...

  7. 「Codeforces 79D」Password

    Description 有一个 01 序列 \(a_1,a_2,\cdots,a_n\),初始时全为 \(0\). 给定 \(m\) 个长度,分别为 \(l_1\sim l_m\). 每次可以选择一个 ...

  8. 「Codeforces 468C」Hack it!

    Description 定义 \(f(x)\) 表示 \(x\) 的各个数位之和.现在要求 \(\sum_{i=l}^rf(i)\bmod a\). 显然 ans=solve(l,r)%a; if(a ...

  9. 「Codeforces 724F」Uniformly Branched Trees

    题目大意 如果两棵树可以通过重标号后变为完全相同,那么它们就是同构的. 将中间节点定义为度数大于 \(1\) 的节点.计算由 \(n\) 个节点,其中所有的中间节点度数都为 \(d\) 的互不同构的树 ...

  10. 「codeforces - 1284G」Seollal

    给定 \(n\times m\) 的网格图,有些格子有障碍,无障碍且相邻的格子之间连边形成图.保证 \((1, 1)\) 无障碍,保证无障碍格子连通. 将网格图黑白染色,相邻格子颜色不同,\((1, ...

随机推荐

  1. bugku xxx二手交易市场

    打开靶场 分析 很明显需要先注册一个账号才行 完成后发现两个上传图片的地方 一个是更换头像, 一个是发布内容 先更换头像试试 首先上传一个木马图片,会发现一直转圈圈,(卡住了) 只能先上传正常的图片了 ...

  2. 自然语言处理 Paddle NLP - 文本语义相似度计算(ERNIE-Gram)

    基于预训练模型 ERNIE-Gram 实现语义匹配 1. 背景介绍 文本语义匹配任务,简单来说就是给定两段文本,让模型来判断两段文本是不是语义相似. 在本案例中以权威的语义匹配数据集 LCQMC 为例 ...

  3. 【Netty实战】1~3章学习笔记

    1. Netty总体结构 1.1 Netty简介 ​ Netty是一款用于创建高性能网络应用程序的高级框架.它的基于 Java NIO 的异步的和事件驱动的实现,保证了高负载下应用程序性能的最大化和可 ...

  4. spring-boot-maven-plugin插件详解

    一. 为什么Spring Boot项目自带这个插件 当我们在SpringBoot官方下载一个脚手架时,会发现pom.xml会自带spring-boot-maven-plugin插件 <?xml ...

  5. 如何在.net6webapi中记录每次接口请求的日志

    为什么在软件设计中一定要有日志系统? 在软件设计中日志模块是必不可少的一部分,可以帮助开发人员更好的了解程序的运行情况,提高软件的可靠性,安全性和性能,日志通常能帮我们解决如下问题: 调试和故障排查: ...

  6. G1垃圾回收参数调优及MySQL虚引用造成GC时间过长分析

    1. 背景 我方有一应用,偶尔会出现GC时间过长(间隔约4小时),导致性能波动的问题(接口最长需要耗时3秒以上).经排查为G1垃圾回收器参数配置不当 叠加 MySQL 链接超过闲置时间回收,产生大量的 ...

  7. SpringBoot项目从0到1配置logback日志打印

    大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教. 以下是正文! 一.写文背景 我们在写后端项目的时候 ...

  8. Jupyter无法运行websocket错误

    Juputer无法连接 系websocket连接出问题,浏览器控制台报错 ws 连接异常 WebSocket connection to 'ws://localhost:8888/api/kernel ...

  9. 强化学习实践:Policy Gradient-Cart pole游戏展示

    摘要:智能体 agent 在环境 environment 中学习,根据环境的状态 state(或观测到的 observation),执行动作 action,并根据环境的反馈 reward(奖励)来指导 ...

  10. Djiango 创建迁移项报错query = query.decode(errors='replace') AttributeError: 'str' object has no attribute 'decode'

    在终端命令行创建迁移项 输入(python manage.py makemigrations) 或(python manage.py migrate)时出现报错信息:Traceback (most r ...