博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【CCPC-Wannafly Winter Camp Day3 (Div1) G】排列(水题)
阅读量:5153 次
发布时间:2019-06-13

本文共 2072 字,大约阅读时间需要 6 分钟。

大致题意:已知 \(p\)\(n\)的一个排列,定义\(A(p)_i=min_{j=1}^ip_j\),若用\(q_i\)表示\(p\)\(i\)小的前缀的长度(以值为第一关键字,下标为第二关键字),先给你\(q\),请你求出字典序最小的\(p\)

简单分析·基本结论

让我们来仔细研究一下样例:

\(i\) \(1\) \(2\) \(3\) \(4\) \(5\)
\(p_i\) \(3\) \(4\) \(2\) \(5\) \(1\)
\(A(p)_i\) \(3\) \(3\) \(2\) \(2\) \(1\)

结合\(A(p)_i\)的定义与这张表格,不难发现\(A(p)_i\)是递减的。

那理论上来说,\(q_i\)就应该是从\(n\)\(1\)了。

但肯定没有这么简单,\(A(p)_i\)存在相等的情况,而相等时又应该是下标较小的在前。

综合上述分析,其实我们可以发现,相等的值应该是一段连续的区间,而这个区间中的最小值就是这个区间的第一个数的值。

手玩样例·验证猜想

结合一下\(q\)的值来手玩一下样例:

\(i\) \(1\) \(2\) \(3\) \(4\) \(5\)
\(q_i\) \(5\) \(3\) \(4\) \(1\) \(2\)

于是,我们可以将\(q\)分解为这样三部分:\(\{5\},\{3,4\},\{1,2\}\),每一部分里都是一段连续的数。

而按照前面的结论,我们取出每一部分的第一个数:\(5,3,1\),可确定它们的值依次为\(1,2,3\),即\(p_5=1,p_3=2,p_1=3\)

而剩余的\(4,2\),由于要字典序最小,我们将其排序得到\(2,4\),然后可以依次确定它们的值为\(4,5\),即\(p_2=4,p_4=5\)

综上所述,\(p=\{3,4,2,5,1\}\),答案正确。

代码

#include
#define Tp template
#define Ts template
#define Reg register#define RI Reg int#define Con const#define CI Con int&#define I inline#define W while#define N 100000using namespace std;int n,a[N+5],s[N+5],ans[N+5];class FastIO{ private: #define FS 100000 #define tc() (A==B&&(B=(A=FI)+fread(FI,1,FS,stdin),A==B)?EOF:*A++) #define pc(c) (C^FS?FO[C++]=c:(fwrite(FO,1,C,stdout),FO[(C=0)++]=c)) #define tn(x) (x<<3)+(x<<1) #define D isdigit(c=tc()) int T,C;char c,*A,*B,FI[FS],FO[FS],S[FS]; public: I FastIO() {A=B=FI;} Tp I void read(Ty& x) {x=0;W(!D);W(x=tn(x)+(c&15),D);} Tp I void write(Ty x) {W(S[++T]=x%10+48,x/=10);W(T) pc(S[T--]);} Ts I void read(Ty& x,Ar&... y) {read(x),read(y...);} I void write_space() {pc(' ');} I void clear() {fwrite(FO,1,C,stdout),C=0;}}F;int main(){ RI i,tot=0,cnt=0;for(F.read(n),i=1;i<=n;++i) F.read(a[i]),a[i]^(a[i-1]+1)?ans[a[i]]=++tot:s[++cnt]=a[i];//对每段区间第一个数记录下值,并将剩余数存下来 for(sort(s+1,s+cnt+1),i=1;i<=cnt;++i) ans[s[i]]=++tot;//将剩余数排序,从而确定值 for(i=1;i<=n;++i) F.write(ans[i]),F.write_space();//输出答案 return F.clear(),0;}

转载于:https://www.cnblogs.com/chenxiaoran666/p/CometOJDay3Div1G.html

你可能感兴趣的文章
[ 转载 ] Java基础11--Java总结篇系列:Java泛型
查看>>
40086311Nim
查看>>
CSS实现背景图片屏幕自适应
查看>>
JS强制刷新页面、清除缓存刷新
查看>>
187. Repeated DNA Sequences
查看>>
servlet文件操作
查看>>
利用bootstrap-select.min.js实现bootstrap下拉列表的单选和多选
查看>>
C# 通过反射为一个对象赋值
查看>>
Asp.net上传文件后台通过二进制流发送到其他Url保存
查看>>
jquery的ajax同步和异步
查看>>
C# 调用PowerShell方法
查看>>
【Java入门提高篇】Day25 史上最详细的HashMap红黑树解析
查看>>
navicat for mysql 在Mac上安装后没有连接列表,就是左边的那一列连接项目怎么办?...
查看>>
[luogu1463 HAOI2007] 反素数 (约数)
查看>>
[luogu4161 SCOI2009]游戏 (DP)
查看>>
CSS--字体
查看>>
vs调试技巧
查看>>
edmx文件
查看>>
限定符注解
查看>>
Linux环境下安装python3
查看>>