Codeforces Round 1051 (Div. 2) 补题记录

news/2025/11/28 2:27:59/文章来源:https://www.cnblogs.com/mubai666/p/19279900

Codeforces Round 1051 (Div. 2) 补题记录

D - Inversion Graph Coloring

题目大意:

当一个序列 \(b_1, b_2, \dots, b_k\) 存在一种对每个下标 \(i\) 染上红色或蓝色的方式,使得每一对 \(i < j\)\(b_i > b_j\) 的下标 \(i, j\) 的颜色不同时,我们称这个序列是“好”的。

给定一个序列 \(a_1, a_2, \dots, a_n\),计算它“好”的子序列数量,并对 \(10^9 + 7\) 取模。

思路:

考虑什么样的子序列会被计入答案。注意到,当存在下标 \(i < j < k\)\(a_i > a_j > a_k\) 时,不存在合法的染色方案。因此题目可以转化为求最长递减子序列长度小于等于 \(2\) 的子序列个数。

接着我们考虑对于第 \(i\) 个数,会与前面已经组成的哪些子序列形成新的子序列。

  • 加入最大值 \(j \leq a_i\) 的子序列中。此时由 \(a_i\) 组成的递减子序列长度为 \(1\)

  • 加入最长递减子序列长度为 \(2\) 且末尾数值 \(k \leq a_i < j\) 的子序列中。此时,\(a_i\) 代替 \(k\) 成为最长递减子序列的最后一个元素,长度依旧为 \(2\)

根据上面的两种情况以及不选择第 \(i\) 个元素与前面元素构成子序列的情况,我们进行 \(dp\),状态转移如下:

  • 不选择 \(a_i\)\(dp[i][j][k] \leftarrow dp[i - 1][j][k];\)

  • \(j \leq a_i\)\(dp[i][a_i][k] \leftarrow dp[i - 1][j][k];\)

  • \(k \leq a_i < j\)\(dp[i][j][a_i] \leftarrow dp[i - 1][j][k].\)

时间复杂度 \(O(n^3)\) 足够通过本题的 Easy Version。

接着我们考虑如何优化 \(dp\)

注意到在转移时,存在如下关系:

\[\begin{cases} dp[i][a_i][k] = \sum_{j \leq a_i} dp[i - 1][j][k] \\ \\ dp[i][j][a_i] = \sum_{k \leq a_i} dp[i - 1][j][k] \end{cases} \]

因此可以考虑把第一维砍掉,用树状数组维护 \(dp\) 每行每列的前缀和,求出增量即可。

\(code:\)

#include <bits/stdc++.h>
using namespace std;#define endl '\n'
#define i64 long longconst int mod = 1000000007;template <typename T>
struct Fenwick {int n;std::vector<T> a;Fenwick(int n = 0) {init(n);}void init(int n) {this->n = n;a.assign(n, T());}void add(int x, T v) {for (int i = x + 1; i <= n; i += i & -i) {a[i - 1] += v;}}T sum(int x) {auto ans = T();for (int i = x; i > 0; i -= i & -i) {ans += a[i - 1];}return ans;}T rangeSum(int l, int r) {return sum(r) - sum(l);}
};void MuBai() {int n;cin >> n;vector<int> a(n + 1);for (int i = 1; i <= n; i ++ ) cin >> a[i];vector<Fenwick<i64>> row(n + 1), col(n + 1);for (int i = 0; i <= n; i ++ ) {row[i].init(n + 1);col[i].init(n + 1);}row[0].add(0, 1), col[0].add(0, 1);vector f(n + 1, vector<i64>(n + 1, 0));for (int i = 1; i <= n; i ++ ) {for (int j = 0; j <= n; j ++ ) {i64 g = col[j].sum(a[i] + 1) % mod;i64 h = (a[i] < j) ? (row[j].sum(a[i] + 1) % mod) : 0;if (g) {row[a[i]].add(j, g);col[j].add(a[i], g);f[a[i]][j] += g;if (f[a[i]][j] >= mod) f[a[i]][j] -= mod;}if (h) {row[j].add(a[i], h);col[a[i]].add(j, h);f[j][a[i]] += h;if (f[j][a[i]] >= mod) f[j][a[i]] -= mod;}}}i64 ans = 0;for (int i = 0; i <= n; i ++ ) {ans += col[i].sum(n + 1) % mod;if (ans >= mod) ans -= mod;}cout << (ans < mod ? ans : ans - mod) << endl;
}int main() {ios::sync_with_stdio(false);cin.tie(nullptr), cout.tie(nullptr);int t; cin >> t;while (t -- ) MuBai();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/979117.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Motia:未来平台

Motia:未来平台项目简介 项目地址:github.com/MotiaDev/motia 架构定位:后端编排 + 多语言运行时 + 智能体支持 开发状态:活跃迭代中,当前为 v0.4.4-beta.97,已有多个真实 use case 示例 支持语言:TypeScript、…

移动端开发

移动端开发一、移动端开发方式随着移动互联网的兴起和手机的普及,目前移动端应用变得愈发重要,成为了各个商家的必争之地。例 如,我们可以使用手机购物、支付、打车、玩游戏、订酒店、购票等,以前只能通过PC端完成…

代码随想录算法训练营第四章 字符串part01

代码随想录算法训练营第四章 字符串part01** 344.反转字符串 ** leetcode链接:https://leetcode.cn/problems/reverse-string/submissions/681193879/ 题目描述:编写一个函数,其作用是将输入的字符串反转过来。输入…

用ikuai软路由提供内网NTP服务

用ikuai软路由提供内网NTP服务1、开启NTP服务2、在路由器上配置DNS,劫持 time.windows.com(客户端设备指定的时间服务器) 指向内网自己的 NTP 服务在路由器上开启强制 DNS 代理 验证方法1、打开 cmd 执行 ping tim…

US$213.75 Xhorse Key Tool Midi Basic Version Update to Advanced Version Service

Upgrade Your Xhorse Key Tool Midi: From Basic to Advanced—Power Up Your Key Programming Capabilities Why Upgrade from Basic to Advanced? In the fast-paced world of automotive key programming, outdate…

AutoVEI Truck Explorer Locksmith 2025: 700 Tokens for Truck Programming Diagnostics

Solving Modern Truck Key & IMMO Challenges: The AutoVEI Truck Explorer Locksmith 2025 The Pain Point: Outdated Tools Can’t Keep Up with 2025 Truck Technology In today’s European and American truc…

DC-2渗透测试 - fish666

DC-2 就是记住,当靶机变成NAT模式的时候,要重新启动!!! kali 192.168.236.129 靶机 192.168.236.133 一、信息收集。 探测目标主机的ip (前提确保攻击机有ip地址。)查看靶机开放哪些端口。 是靶机的ip地址…

AutoVEI Truck Explorer 2025 Updated: 700 Tokens Programming Diagnostic Tool for Euro/Amer Trucks

Navigating Truck Diagnostics & Programming in Europe & America: Meet the AutoVEI Truck Explorer Standard 2025 The Challenge: Outdated Tools Can’t Keep Up with Modern Trucks For European and Am…

k8s基本对象详解

Kubernetes 基本对象概念详解 1. Pod 1.1 核心概念 Pod是Kubernetes中最小的可部署单元,代表集群中运行的一个进程。 关键特性:一个Pod包含一个或多个紧密相关的容器 共享网络命名空间(同一IP地址) 共享存储卷 共享…

k8s核心组件详解

Kubernetes 核心组件详解 控制平面组件 (Control Plane Components) kube-apiserver 功能职责:Kubernetes 集群的前端接口,所有内部组件和外部客户端都通过API Server进行通信 处理REST请求,验证并配置API对象(Pod…

BLOG迁移: 从Halo + CF Tunnel 到 Hugo + github + Cloudflare page

BLOG迁移: 从Halo + CF Tunnel 到 Hugo + github + Cloudflare page 背景 前一段时间, 我的blog数据丢了 其实算不上彻底丢了, 原始的blog内容还存储在思源笔记上, 甚至发布记录都有, 所以本质上的数据确实没有丢 过去…

JDK:Linux下载安装jdk1.8

JDK:Linux下载安装jdk1.8下载jdk wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1…

图论中的核心C++算法,包括存储结构、核心思路、速记口诀以及学习方法, 一站式上机考试学习

一、图的存储结构 不同算法适配不同的存储结构,选择合适的存储方式是实现算法的基础: 1. 邻接矩阵(二维数组) // 适用于稠密图,顶点数n较小的情况 const int MAXN = 1005; int graph[MAXN][MAXN]; // graph[i][j]…

hive 中 group by 和 distinct 孰优孰劣?

首先声明一下,hive是什么: hive 不是数据库,hive 只是一个数据仓库工具,可以用来查询、转化和加载数据,是可以调用 mapreduce 任务、用类 mysql 语法查询HDFS数据的一个工具。再来说 mapreduce 是什么,mapreduce…

DDD抽奖项目业务回顾

抽奖系统架构 模块概览模块名称 DDD 分层 职责描述trigger 接口层 (Interface Layer) 负责与外部系统交互,接收请求、身份验证、日志记录,并将请求转发给应用层。api 接口契约 (Contracts) 独立的服务契约定义,包含…

黑马程序员SpringCloud微服务开发与实战-微服务-服务拆分02

黑马程序员SpringCloud微服务开发与实战-微服务-服务拆分02Posted on 2025-11-28 00:17 心默默言 阅读(0) 评论(0) 收藏 举报接下来,我们就一起将黑马商城这个单体项目拆分为微服务项目,并解决其中出现的各种问…

API设计最佳实践 - 智慧园区

后端工程师的API设计与开发实战指南:从原则到部署作为一名后端开发,日常工作中一大部分时间都在和API打交道。它就像是整个应用的「服务员」,前端、移动端或者其他服务想要什么数据、执行什么操作,都得通过它。一个…

Python高阶知识点整理

数据类型 常用方法 (Method) 简要说明与应用场景字符串 str .strip() 去除首尾空格(常用于处理用户输入).split(sep) 按指定分隔符分割成列表(处理CSV数据常用).join(iter) 将列表元素合并成字符串(.split的逆操作…

第4单元检测卷

第4单元检测卷 - 题目、答案与解析 一、单项选择题题目:在Python中,用于创建一个新字典的语法是 ( )A. d = dict[] B. d = {} C. d = () D. d = new dict()答案:B 解析:在Python中,创建字典最常用和直接的方法是使…