description
input
第一行乙個數 n,表示序列的長度。
第二行 n 個整數,第 i 個整數表示 ai,如果 ai = 0,則表示這個位置沒有填數。
output
如果不存在合法的填數方案,則輸出 −1; 否則第一行輸出乙個整數,表示最大的 an;第二行 n 個正整數,第 i 個數表示完 成填數後的序列的第 i 個元素。 如果有多組合法的解,輸出任意一組
sample input
【樣例 1 輸入】sample output70 1 0 0 0 3 0
【樣例 2 輸入】
40 0 0 3
【樣例 1 輸出】data constraint31 1 2 2 3 3 3
【樣例 2 輸出】
-1
對於 30% 的資料,n ≤ 1000;
對於另外 30% 的資料,資料保證隨機生成;
對於 100% 的資料,2 ≤ n ≤ 2 × 10^5 , 0 ≤ ai ≤ 10^5。
分析這道題我們可以維護二元組(x表示值,y表示之前這個值出現的最長長度)
兩個二元組,up和down,up表示x盡可能大,down相反
那麼顯然遇到已經有數填在那個位上的情況是要處理一下的,我們只需要取一波最值
an要盡可能大的話就從upn取值,判斷一下upn.y是否只為1,要特殊搞一下
最後反過來做一遍就得到序列了
#include #includeview code#include
using
namespace
std;
const
int n=2e5+1
;int
n;int
a[n],cnt[n];
struct
eyz
}up[n],dn[n];
intmain()
up[1].x=up[1].y=dn[1].x=dn[1].y=1
;
for (int i=2;i<=n;i++)
else up[i].x=up[i-1].x,up[i].y=up[i-1].y+1
;
if (dn[i-1].y+1>5
)
else dn[i].x=dn[i-1].x,dn[i].y=dn[i-1].y+1
;
if(a[i]) }}
eyz ans=up[n];
if (ans.y==1)
if (ans"
-1");return0;}
a[n]=ans.x;cnt[ans.x]++;
for (int i=n-1;i>=1;i--)
printf(
"%d\n
",ans.x);
for (int i=1;i<=n;i++) printf("
%d "
,a[i]);
fclose(stdin);fclose(stdout);
}
JZOJ 5810 簡單的玄學
思路 就是考慮乙個結論 對於 1 x 2 n 那麼 x 與 2 n x 中的2的個數相等。證明 我們將 x 表示成 2 k b 那麼 2 n x 就是 2 n 2 k b 當消去 k 個2之後,剩下的就是 2 n b 顯然不能被2除了 因為b顯然不是乙個偶數 那麼我們推出來的概率式子為 1 i ov...
JZOJ5728 簡單計數
乍一看不是很會。先考慮不是環怎麼做。考慮分類地計數,即把方案歸到某一型別裡,再分別計算每乙個型別的數量來求答案。最終一種方案肯定有若干段相同顏色段,我們可以直接考慮每一種顏色的劃分貢獻,然後再算出他們組合起來的方案數。具體地,我們計算出f i,j 表示把i個相同的球分成j段的貢獻和,一種方案貢獻為每...
jzoj 5562 簡單構造
description 一次歌唱比賽中,一位歌手剛剛結束表演,評委正在打分。一共有n 位評委,他們每人可以打1 分或0 分,第i 位評委希望歌手的得分為v i 評委們有特殊的控分技巧,他們會按乙個順序依次評分,第乙個評分的評委 會不管三七二十一打0 分。對於接下來的評委,假設前面a 位評委評分總和為...