zoukankan      html  css  js  c++  java
  • 【CCPC-Wannafly Winter Camp Day3 (Div1) G】排列(水题)

    点此看题面

    大致题意:已知 (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<bits/stdc++.h>
    #define Tp template<typename Ty>
    #define Ts template<typename Ty,typename... Ar>
    #define Reg register
    #define RI Reg int
    #define Con const
    #define CI Con int&
    #define I inline
    #define W while
    #define N 100000
    using 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;
    }
    
  • 相关阅读:
    WebConfig配置文件详解
    python标准库介绍——32 Queue 模块详解
    python标准库介绍——31 threading 模块详解
    python标准库介绍——30 code 模块详解
    python标准库介绍——29 zlib 模块详解
    python标准库介绍——28 sha 模块详解
    python标准库介绍——28 md5 模块详解
    python标准库介绍——27 random 模块详解
    python标准库介绍——26 getopt 模块详解
    python标准库介绍——25 errno 模块详解
  • 原文地址:https://www.cnblogs.com/chenxiaoran666/p/CometOJDay3Div1G.html
Copyright © 2011-2022 走看看