上海市计算机学会2025.10月赛丙组T5

news/2025/10/24 22:52:28/文章来源:https://www.cnblogs.com/huangems/p/19164367

题目在这里

9月份的时候打梦熊的某场 \(NOIP\) 模拟赛作为 \(T1\) 出现过,没写出来

题解也没有看懂,感觉很模糊

然后打上海市10月月赛 \(T5\) 又出现了

第一次在比赛中遇到重题,内心充满了激动与绝望

因为还是不会写。。。

理了好几遍思路,终于是可以来写题解了

题解

\[\sum_{i=1}^n \max(0, i - a_i) = \sum_{i=1}^n \sum_{j=i+1}^n [a_i > a_j] \]

观察一下这个式子,左边即是冒泡排序的最优操作次数,右边是逆序对数量,也就是实际操作次数

什么时候冒泡排序达到能达到最优操作次数呢?即任何数字都刚好被交换到指定位置,没有多余交换

举个例子:

\[3,2,1 \]

\[2,3,1 \]

\[2,1,3 \]

\[1,2,3 \]

在这种情况下就是不优的,\(2\) 原来就在正确位置上,却被交换到了第一位一次

我们发现,如果排列的最长下降子序列长度大于或等于 \(3\) 时,是不优的,也就是等式不成立

证明

设原序列有长度为 \(n\) 下降子序列为 \(A_1,A_2,A_3...\) ,则 \(A_1\) 最后一定会被交换到第 \(n\)

在这个过程中,第 \(2\)\(n-1\) 都会被向左交换一次

但第 \(2\)\(n-1\) 项都还与 \(A_n\) 存在逆序对,肯定还要被向右交换至少一次

\(2\)\(n-1\) 项都被重复交换了,这当中至少有一个元素,所以

\[2 \leq n-1 \]

\[n \ge 3 \]


那也就是求在长度为 \(n\) 的排列中,最长下降子序列长度不超过 \(2\) 的排列数量

考虑动态的向末尾加入数,建立一个集合 \(S\) 表示所有还未被加入的数

设当前已加入的数中的最大值为 \(x\)

1.加入一个比 \(x\) 小的数:

此时只能加 \(S\) 中最小的元素,若加入非最小元素,则最小元素一定会出现在后面,此时 \(x\) ,当前加入元素,最小元素构成长度为 \(3\) 的下降子序列

2.加入一个比 \(x\) 大的数:

只要比 \(x\) 大的数加入都不会产生影响,这个任意。


设计状态 \(f_{i,j}\) 表示已加入 \(i\) 个数字,当前最大值为 \(j\) ,则 \(f_{i,j}\) 可以向 \(f_{i+1,j}\)\(f_{i,j+k}\) 转移,其中 \(i>j\) 的状态不存在

我们可以参考 \(shopping\,\,\,plans\) 类题的思路,考虑简化转移过程,到 \(f_{i,j+k}\) 可以由好几次 \(f_{i,j+1}\) 拼凑而来

我们发现它变成了一个在网格图中从 \((1,1)\) 走到 \((n,n)\) 的方案数问题

因为 \(i>j\) 的状态不存在,所以路径当中不得越过 \(i=j\) 的对角线

这不就是卡特兰数吗?接下来考虑怎么处理固定前缀

先去看前缀是否合法,计算其最长下降子序列的长度,这个可以用 \(O(n\,\,log\,\,n)\) 求最长下降子序列 实现,若前缀不合法,直接输出 \(0\)

然后把前缀总结成一个状态,即取其长度与最大值,也就是说将上述问题改为指定起点计算就可以了

在这个问题中卡特兰数应该怎么用呢?参考原来卡特兰数在该问题中的推导方法

不超过直线 \(y=x\) ,也就是至少碰到一次 \(y=x+1\)

那么只要计算这些碰到 \(y=x+1\) 的方案个数,参考反射法

image

将在碰到 \(y=x+1\) 之前的部分作关于 \(y=x+1\) 的镜面反射,得到此时的起点由 \((0,0)\) 变成 \((-1,1)\)

所以卡特兰数的计算公式为 \(C_{2n}^n-C_{2n}^{n-1}\)

现在的问题也是同理,可以将起点 \((u,v)\) 通过反射转为 \((v-1,u+1)\)

该问题计算公式即为:

\[C_{n-u+n-v}^{n-v}-C_{n-(v-1)+n-(u+1)}^{n-(u-1)} \]

化简:

\[C_{2n-u-v}^{n-v}-C_{2n-u-v}^{n-u+1} \]

带入原问题中 \(u,v\) 分别是合法前缀中的最大值和合法前缀的长度

注意需要特判 \(n=m\) 的情况

CODE
#include<bits/stdc++.h>
#define usetime() (double)clock () / CLOCKS_PER_SEC * 1000.0
using namespace std;
typedef long long LL;
const int maxn=5e5+5;
const int mod=1e9+7;
void read(int& x){char c;bool f=0;while((c=getchar())<48) f|=(c==45);x=c-48;while((c=getchar())>47) x=(x<<3)+(x<<1)+c-48;x=(f ? -x : x);
}
int n,m;
int a[maxn];
LL fpow(LL x,int y){LL ans=1;while(y){if(y&1) ans=ans*x%mod;y>>=1,x=x*x%mod;}return ans;
}
LL ww(int x){LL ans=1;for(int i=1;i<=x;i++) ans=ans*i%mod;return ans;
}
LL C(int x,int y){return ww(x)*fpow(ww(x-y),mod-2)%mod*fpow(ww(y),mod-2)%mod;
}
int main(){//freopen("nene.in","r",stdin);//freopen("nene.out","w",stdout);read(n),read(m);bool f=0;int u=m,v=0;vector<int> p;for(int i=1;i<=m;i++){read(a[i]);int j=upper_bound(p.begin(),p.end(),-a[i])-p.begin();if(j==(int)p.size()){p.push_back(-a[i]);if(p.size()==3) f=1;}else p[j]=-a[i];v=max(v,a[i]);}if(f) printf("0");else if(n==m) printf("1");else printf("%lld",(C(2*n-u-v,n-v)-C(2*n-u-v,n-u+1)+mod)%mod);return 0;
}
//^o^

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

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

相关文章

2025年微信编辑器年度测评:8款工具横评,谁才是内容创作者的效率神助攻?

作为一名深耕新媒体领域7年的资深编辑,我用过不下20款公众号编辑器。踩过不少坑,也见证了行业的快速发展。今天,我将从【功能完整度、操作流畅度、用户体验、AI智能化、平台适配】等维度,对市面上主流的8款微信图文…

玩转单片机之智能车小露——七彩LED呼吸灯

如果LED闪烁(玩转单片机之智能车小露——LED闪烁实战)不能满足你,那么七彩LED呼吸灯绝对可以给你带来足够的乐趣。 七彩LED呼吸灯一般都需要PWM进行调光,所以编程有无限的灵活性。本文七彩呼吸灯可以实现彩虹单色显…

Windows Update - Part 3: Patch Management

The Four Phases of Patch Management:Assess Identify Evaluate and Plan Deploy2014 ~ 2025: cloud-first, WaaS decadeWindows as a ServiceServicing channelsGeneral Availability Channel Long-Term Servicing C…

windows 发现音量按键调值不够顺畅

一波未平,一波又起 同事在windows GPIO driver 里修改 power button delay 引起了音量按键的不正常,快速按一下,颗粒度从之前的2变成了4根据gpioint 的定义,是可以定义debounce 的值的,但是不知道是多少 https://…

CUDA C++ 入门:矩阵乘法

最近接触了 GPU 编程,尝试了用 CUDA 写一些并行计算案例,拿了矩阵乘法作为第一个练手项目。 过去的经验让我误以为这东西很 naive,但其实从并行的角度看,会发现很多串行思维所没有机会接触的细节——总体而言,虽然…

在C语言中,定义常量的方法有哪几种?

在C语言中,定义常量的方法主要有以下3种: 一、#define 预处理指令(宏定义) 通过预处理指令将符号替换为指定文本,是最基础的常量定义方式。 语法: #define 常量名 常量值 // 无分号,预处理阶段会直接替换示例:…

docker 艹哥笔记

docker 艹哥笔记[root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@localhost ~]# [root@localhost ~]# [root@localhost ~]# [root@localhost ~]# docke…

OUC第一周WP

Misc 签到题 扫码关注,回复flag就出来了ezBase64 base64加密,解密出来flagBaseCrack 经过多次base系列加密,赛博厨子试出来 最后经过base64->base32->base64解密得到flag ROT13 rot13加密,解密得到flag Rai…

在windows 上用GPIO定义几个按键

1. ACPI button 文档ACPI 按钮设备 - Windows drivers | Microsoft Learn 2. acpi button 的acpi dochttps://uefi.org/specs/ACPI/6.6/09_ACPI_Defined_Devices_and_Device_Specific_Objects.html#button-interrupts …

第二十三篇

今天是10月24号,没上课,爽。

扩展域并查集理解性总结

扩展域并查集理解性总结纯文字内容,较短,较枯燥,但感谢你能点进来并完成阅读。 前置:并查集 扩展域并查集(种类并查集) 理解思想 一.团伙给定若干满足如下两条的关系,求会构成多少个团伙:\(x\)、\(y\) 为朋友 \(…

软件工程学习日志2025.10.24

在当今快节奏的软件开发世界中,技术硬实力是入场券,而卓越的沟通协作能力,则是决定一个工程师能走多快、多远的隐形翅膀。为了弥合校园与职场之间的能力鸿沟,我深入调研了以高效协同著称的字节跳动,并以此为镜,反…

ABP - 种子数据 [IDataSeeder、DataSeedContext]

种子数据(Seed Data) 核心辅助类:IDataSeeder:数据种子接口。 DataSeedContext:种子数据上下文。种子数据是指项目启动时自动向数据库插入的初始化数据(比如默认管理员账号、基础配置项、测试数据等),核心作用…

[KaibaMath]1014 基于取整函数[x]的定义求解一道特殊的一元二次方程

[KaibaMath]1014 基于取整函数[x]的定义求解一道特殊的一元二次方程取整函数[x]的定义是[x]≤x<[x]+1. 下面基于运用此定义,求解一道特殊的一元二次方程:x^2-2[x]+0.9=0.

基础题目

超级基础的题虽然是数学,但是仍以 \(OI\) 的题为例,毕竟 \(OI\) 的组合计数题还是很高质的,但别担心,组合计数主要是数学推导,所以文中的题仅会推导数学的理论知识或公式,不会有代码实现。但为了方便,还是会把题…

完整教程:紫外UV相机在机器视觉检测方向的应用

完整教程:紫外UV相机在机器视觉检测方向的应用pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &…

三种 Badcase 精度验证方案详解与 hbm_infer 部署实录

在模型结构优化与部署量化过程中,开发者往往会遇到一个关键任务:​基于历史 Badcase 数据验证模型精度变化​,确保模型修改不会引入明显性能退化。 这类验证常见于感知、预测、行为识别等任务,尤其在客户交付或精度…

CF512E. Cycling City

题目传送门 十分有趣的题。 思路 三条路径,本质上其实就是 \(x,y\) 同时属于两个有交集(至少交一条边)的简单环,这个肯定没问题。 套路的跑一遍 dfs,然后就有了返祖边树边和横叉边,然后朴素的分讨然后用个数据结…

ABP - 事件总线(Event Bus)[IEventBus、LocalEventBus、IntegrationEvent]

(1)事件总线(Event Bus) 核心辅助类:IEventBus:发布/订阅事件。 LocalEventBus:本地事件总线(进程内)。 IntegrationEvent:跨服务集成事件。事件总线是一种“发布-订阅”模式的通信机制,用于解耦系统中的各…