「又要出題了。」 宇宙出題中心主任 —— 吉公尺多出題斯基,坐在辦公桌前策劃即將到來的 uoi。對於某乙個位置這場比賽有 nn 道題,吉公尺多出題斯基需要決定這些題目的難度,然後再在汪洋大海中尋找符合該難度的題目。
題目的難度可以用乙個 11 到 nn 的排列 a1,…,ana1,…,an 表示,其中 aiai 表示第 ii 道題目在這 nn
道題目中是第 aiai 簡單的題目,即恰有 ai−1ai−1 道題目比第 ii 道題目簡單。
經驗豐富的吉公尺多出題斯基早就悟出了一種科學地決定難度順序的方法。首先,吉公尺多出題斯基定義了難度遞增子串行為序列
ap1,ap2,…,apkap1,ap2,…,apk (1≤p1< p2<⋯< pk≤n1≤p1< p2< ⋯< pk≤n) 滿足
ap1< ap2<⋯< apkap1< ap2< ⋯< apk 。然後,吉公尺多出題斯基決定了 nn 個整數
f1,…,fnf1,…,fn,他希望找出乙個難度順序使得對於每個 1≤i≤n1≤i≤n 均滿足以 aiai
結尾的難度遞增子串行的最長長度恰好為 fifi。
但吉公尺多出題斯基日理萬機,於是他找到了你 —— 風璃殤做不出題耶維奇,請你幫助吉公尺多出題斯基構造乙個符合條件的 a1,…,ana1,…,an
吧! 輸入
第一行乙個正整數 nn。
接下來一行 nn 個數,其中第 ii 個數表示 fifi。(1≤fi≤ n1≤fi≤n) 輸出
輸出一行 nn 個數,表示 a1,…,ana1,…,an。
題目保證至少存在一組解。如有多組解,輸出任意一組均可。
i 的答案f[
i]應該滿足:1.可以達到這個答案。2.答案不能變的更優。
對於1,應該讓當前數大於最小的f[
i−1]
對應的數【可以看出,就是最右端的那個】。對於2,應該讓當前數小於最小的f[
i]對應的數【也是最靠右的】。
所以掃瞄一遍維護每個
f 值最靠右的位置建立約束條件,拓撲一遍。
#include
#include
#include
using
namespace
std;
int a[100010],f[100010],fir[100010],ne[1000010],to[1000010],du[100010],right[100010],que[100010],n,tot;
void add(int u,int v)
int main()
hd=1;
tl=0;
for (i=1;i<=n;i++)
if (!du[i])
que[++tl]=i;
for (i=n;i;i--)
for (i=1;i<=n;i++)
printf("%d%c",a[i],i==n?'\n':' ');
}
uoj278 UTR 2 題目排列順序
題目 讀進來 f 之後,把權值作為第一關鍵字從小到大排序,位置作為第二關鍵字從大到小排序,這樣排序後的第 i 個位對應的位置就應該填數字 i 權值作為第一關鍵字,保證了出現在其之前的數權值必它小的填的數也比它小,權值必它大的填的數也比它大 權值相同時按照位置從大到小排序,這樣權值相同的一組就是遞減的...
UOJ278 UTR 2 題目排列順序
作者部落格 正解 排序.解題報告 考場上我是make了幾組資料,然後用暴力跑跑才發現的結論.比如說 顯然2只能由1轉移過來,3只能由2轉移過來,並且,相同權值的話,最後乙個顯然是最小的,不然就可以再加一了呀.所以按權值為第一關鍵字 從小到大 下標為第二關鍵字 從大到小 排序,依次編號即可。我在考場上...
渣渣ACM日記 278 排隊 NYOJ
時間限制 3000 ms 記憶體限制 65535 kb 難度 1 描述 週末了,軟體acm的隊員準備玩玩遊戲,娛樂一下,cy想了乙個好主意,所有隊員站成乙個圈,從1開始報數,凡是報出指定數字的人要出列,有人出列後,下個人重新從1開始報數。最後一位 倖存者 要給大家表演個節目。由於隊員正在不斷的壯大,...