news 2026/4/27 11:19:01

打卡信奥刷题(3174)用C++实现信奥题 P7972 [KSN2021] Self Permutation

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
打卡信奥刷题(3174)用C++实现信奥题 P7972 [KSN2021] Self Permutation

P7972 [KSN2021] Self Permutation

题目描述

给定一个长度为NNN的排列aia_iai,你可以执行若干次操作:

  • 选择两个相邻的数,删除它们中较大的那个。

问最后可能得到序列的数量,答案对109+710^9+7109+7取模。

注意如果两个数中间所有的数被删除了,它们会变成相邻的。

输入格式

第一行输入一个正整数NNN

第二行输入NNN个正整数aia_iai

输出格式

输出一个整数代表答案。

输入输出样例 #1

输入 #1

3 2 3 1

输出 #1

3

输入输出样例 #2

输入 #2

4 2 1 4 3

输出 #2

6

说明/提示

【样例解释】

对于第一组样例,以下为所有可能得到的序列:

  • [2,3,1][2,3,1][2,3,1]
  • [2,3,1]→[2,1][\bold2,\bold3,1]\to[2,1][2,3,1][2,1]
  • [2,3,1]→[2,1]→[1][\bold2,\bold3,1]→[\bold2,\bold1]→[1][2,3,1][2,1][1]

对于第二组样例,以下为所有可能得到的序列:

  • [2,1,4,3][2,1,4,3][2,1,4,3]
  • [2,1,4,3]→[1,4,3][\bold2,\bold1, 4, 3]\to[1, 4, 3][2,1,4,3][1,4,3]
  • [2,1,4,3]→[1,4,3]→[1,3][\bold2,\bold1, 4, 3]\to[1,\bold4,\bold3]\to[1, 3][2,1,4,3][1,4,3][1,3]
  • [2,1,4,3]→[1,4,3]→[1,3]→[1][\bold2,\bold1, 4, 3]\to[1,\bold4,\bold3]\to[\bold1,\bold3]\to[1][2,1,4,3][1,4,3][1,3][1]
  • [2,1,4,3]→[2,1,3][2, 1,\bold4,\bold3]\to[2, 1, 3][2,1,4,3][2,1,3]
  • [2,1,4,3]→[2,1,3]→[2,1][2, 1,\bold4,\bold3]\to[2,\bold1,\bold3]\to[2, 1][2,1,4,3][2,1,3][2,1]

【数据范围】

本题采用捆绑测试。

  • Subtask 1(8 points):只存在一组数据,满足N=6N=6N=6A=[2,5,1,3,4,6]A=[2,5,1,3,4,6]A=[2,5,1,3,4,6]
  • Subtask 2(20 points):N≤200N\leq 200N200
  • Subtask 3(13 points):N≤2000N\leq 2000N2000Ai=iA_i=iAi=i
  • Subtask 4(9 points):Ai=iA_i=iAi=i
  • Subtask 5(23 points):N≤2000N\leq 2000N2000
  • Subtask 6(27 points):无特殊限制。

对于所有数据,N≤3×105N\leq 3\times 10^5N3×105,保证输入的aia_iai能构成一个排列。

C++实现

#include<bits/stdc++.h>usingnamespacestd;usingii=pair<int,int>;constintN=3e5+10;constintmod=1e9+7;intn,a[N];intdp[N],sum[N];// sum 是前缀和intmain(){ios::sync_with_stdio(0);cin.tie(0);cin>>n;for(inti=1;i<=n;++i)cin>>a[i];set<ii>s;sum[0]=1;for(inti=1,res=0;i<=n;++i){// res 维护的是当前 set 内 dp 值之和ii u;while(!s.empty()){u=(*s.rbegin());if(u.first>a[i]){res=(res-dp[u.second]+mod)%mod;s.erase(u);}elsebreak;}if(s.empty())dp[i]=sum[i-1];elsedp[i]=(res+sum[i-1]-sum[u.second])%mod;if(dp[i]<0)dp[i]+=mod;sum[i]=(sum[i-1]+dp[i])%mod;s.insert({a[i],i});res=(res+dp[i])%mod;}intans=0;for(ii u:s)ans=(ans+dp[u.second])%mod;cout<<ans<<endl;return0;}

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/27 11:11:20

信息安全认证到底能给遵义凤冈企业带来什么?

信息安全认证到底能给遵义凤冈企业带来什么&#xff1f;如今&#xff0c;无论是大小企业&#xff0c;都或多或少面临着数据泄露、网络攻击、内部文件外泄等安全问题。一旦发生安全事件&#xff0c;不仅会造成直接经济损失&#xff0c;还可能面临监管处罚、客户流失&#xff0c;…

作者头像 李华
网站建设 2026/4/27 11:06:41

vLLM-v0.17.1参数详解:--gpu-memory-utilization与--max-num-batched-tokens调优

vLLM-v0.17.1参数详解&#xff1a;--gpu-memory-utilization与--max-num-batched-tokens调优 1. vLLM框架简介 vLLM是一个专为大型语言模型(LLM)设计的高性能推理和服务库&#xff0c;以其出色的吞吐量和易用性著称。这个项目最初由加州大学伯克利分校的天空计算实验室(Sky C…

作者头像 李华
网站建设 2026/4/27 11:05:42

Go语言的context.WithDeadline截止时间与时钟漂移在分布式系统中的处理

在分布式系统中&#xff0c;时间管理是确保一致性和可靠性的关键挑战之一。Go语言的context.WithDeadline机制为开发者提供了一种优雅的方式来控制任务的执行时间&#xff0c;但面对时钟漂移问题&#xff0c;如何确保其有效性成为分布式架构设计的难点之一。本文将探讨context.…

作者头像 李华
网站建设 2026/4/27 10:58:03

RK3588主线支持进展与嵌入式开发实践

1. RK3588主线上游支持现状解析作为当前Arm架构单板计算机领域最受欢迎的SoC之一&#xff0c;Rockchip RK3588的主线支持进展始终牵动着开发者社区的心弦。这颗发布于2022年的芯片采用了四核Cortex-A76四核Cortex-A55的big.LITTLE架构&#xff0c;但直到2024年&#xff0c;其完…

作者头像 李华
网站建设 2026/4/27 10:50:48

3DSident 技术深度解析:任天堂 3DS 硬件信息检测架构揭秘

3DSident 技术深度解析&#xff1a;任天堂 3DS 硬件信息检测架构揭秘 【免费下载链接】3DSident PSPident clone for 3DS 项目地址: https://gitcode.com/gh_mirrors/3d/3DSident 3DSident 作为 PSPident 的 3DS 移植版本&#xff0c;是一款专为任天堂 3DS 设备设计的硬…

作者头像 李华