玄學 JZOJ 5811 簡單的填數

2022-04-30 20:15:08 字數 1581 閱讀 8113

description

input

第一行乙個數 n,表示序列的長度。

第二行 n 個整數,第 i 個整數表示 ai,如果 ai = 0,則表示這個位置沒有填數。

output

如果不存在合法的填數方案,則輸出 −1; 否則第一行輸出乙個整數,表示最大的 an;第二行 n 個正整數,第 i 個數表示完 成填數後的序列的第 i 個元素。 如果有多組合法的解,輸出任意一組

sample input

【樣例 1 輸入】

70 1 0 0 0 3 0

【樣例 2 輸入】

40 0 0 3

sample output

【樣例 1 輸出】

31 1 2 2 3 3 3

【樣例 2 輸出】

-1

data constraint

對於 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 #include 

#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);

}

view code

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 位評委評分總和為...