【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;
}
【CCPC-Wannafly Winter Camp Day3 (Div1) G】排列(水题)的更多相关文章
- 2020 CCPC Wannafly Winter Camp Day1 C. 染色图
2020 CCPC Wannafly Winter Camp Day1 C. 染色图 定义一张无向图 G=⟨V,E⟩ 是 k 可染色的当且仅当存在函数 f:V↦{1,2,⋯,k} 满足对于 G 中的任 ...
- CCPC-Wannafly Winter Camp Day3 Div1 - 排列
题目链接:https://zhixincode.com/contest/14/problem/A?problem_id=203 time limit per test: 1 secondmemory ...
- CCPC Wannafly Winter Camp Div2 部分题解
Day 1, Div 2, Prob. B - 吃豆豆 题目大意 wls有一个\(n\)行\(m\)列的棋盘,对于第\(i\)行第\(j\)列的格子,每过\(T[i][j]\)秒会在上面出现一个糖果, ...
- 【CCPC-Wannafly Winter Camp Day3 (Div1) D】精简改良(状压DP)
点此看题面 大致题意: 给你一张图,定义\(dis(i,j)\)为\(i\)与\(j\)的最短距离,现要求删去若干条边,使得图仍然联通,且\(\sum_{i=1}^n\sum_{j=i+1}^ndis ...
- 【CCPC-Wannafly Winter Camp Day3 (Div1) I】石头剪刀布(按秩合并并查集)
点此看题面 大致题意: 有\(n\)个人,第\(i\)个人坐在编号为\(i\)的座位上,每个人等概率有石头.剪刀.布中的一张卡片.有两种操作:第一种是第\(y\)个人挑战第\(x\)个人,如果胜利则\ ...
- 【CCPC-Wannafly Winter Camp Day4 (Div1) G】置置置换(动态规划)
点此看题面 大致题意: 求出有多少个长度为\(n\)的排列满足对于奇数位\(a_{i-1}<a_i\),对于偶数位\(a_{i-1}>a_i\). 考虑打表? 考虑每次只有一个数\(n\) ...
- Wannafly Winter Camp Day8(Div1,onsite) E题 Souls-like Game 线段树 矩阵乘法
目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog @ Problem:传送门 Portal 原题目描述在最下面. 简单的 ...
- Wannafly Winter Camp Day5 Div1 E题 Fast Kronecker Transform 转化为NTT或FFT
目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog @ Problem:传送门 原题目描述在最下面. 对给定的式子算解. ...
- CCPC-Wannafly Winter Camp Day3 Div1 - 精简改良 - [生成树][状压DP]
题目链接:https://zhixincode.com/contest/14/problem/D?problem_id=206 样例输入 1 5 5 1 2 1 1 3 1 2 4 1 2 5 1 ...
随机推荐
- layer 弹出对话框 子父页面相互参数传递
转载:https://blog.csdn.net/flybridy/article/details/78610737
- Windows下 virtualenv 使用
Windows下 virtualenv 使用 win python virtualenv 首先在电脑上安装两个不同版本的python mkvirtualenv --python C:\Python34 ...
- 19. Remove Nth Node From End of List(C++,Python)
Given a linked list, remove the nth node from the end of list and return its head. For example, Give ...
- UVA - 213解题报告
题目链接:https://cn.vjudge.net/problem/UVA-213 Sample input TNM AEIOU 0010101100011 1010001001110110011 ...
- php数组·的方法3-数组指针
/* * 数组指针函数 * */ //key() current() 指针一直停在第一位 不会下移 echo '<hr>'; $arr5 = array('name' => 'hxq ...
- Linux环境编程--waitpid与fork与execlp
waitpid waitpid(等待子进程中断或结束) 表头文件 #include<sys/types.h> #include<sys/wait.h> 定义函数 pid_t w ...
- java 各进程功能java,javac,javaw,javaws,javap
javac 代码编译成字节码 javap字节码解析成代码 java.exe用于启动window console 控制台程序 javaw.exe用于启动 GUI程序 javaws.exe用于web程序 ...
- TCP连接的ISN、连接建立超时及TCP的长短连接
问题现象: 一.TCP连接的ISN 之前我们说过初始建立TCP连接的时候的系列号(ISN)是随机选择的,那么这个系列号为什么不采用一个固定的值呢?主要有两方面的原因 防止同一个连接的不 ...
- DEDE利用Ajax实现调用当前登录会员的信息简要说明
其实这个功能在dede默认的模板上就有,只能算是在原有的功能上进行改造而已. 1.首先需要加载一个ajax的js文件进来 <script language="javascript&qu ...
- hduoj 2602Bone Collector
Bone Collector Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...