牛客練習賽 69

2021-10-09 09:46:16 字數 2909 閱讀 3786

第一次打牛客直接。。。

y1s1牛客的評測系統真的慢,搞得我不想交

題目鏈結

首先先對陣列a逆序貪心可得val

(i,j

)=a1

+a2+

⋯+ai

×j

val(i,j)=a_1+a_2+\dots+a_

val(i,

j)=a

1​+a

2​+⋯

+ai×

j​嘗試證明:分析可知我們最終會選擇i×j

i×ji×

j個陣列a的數,貪心肯定每個數選的越大越好,嘗試每一組的前j

jj大的數都是陣列中前i×j

i×ji×

j大的數的子集,即可將原陣列分成i

ii個部分選出前i×j

i×ji×

j大。

#include

#include

using

namespace std;

const

int n=

100010

;typedef

long

long ll;

ll a[n]

,s[n]

;int n;

int x,y;

intmain()

題目鏈結

對於乙個連通圖,嘗試去掉一些邊,但是最終保證圖連通而且留下的邊盡量的大,如果我們用kurskal求最大生成樹剛好滿足上述需求。我們在求dis

t(u,

v)

dist(u,v)

dist(u

,v)時,只走最大生成樹上的邊一定能保證dis

t(u,

v)

dist(u,v)

dist(u

,v)最大。選擇排列時,對於每條邊最少都要經過一次,答案一定不會超過最大生成樹上的邊權和。嘗試構造一種解使得答案等於最大生成樹上的邊權和:依次選擇最小的邊的兩個點,然後把這條邊刪去(意思為不能再次選擇該邊),這樣構造即可構造出最優答案。

#include

#include

using

namespace std;

typedef

long

long ll;

const

int n=

500010

;struct node

}e[n]

;int n,m;

int p[n]

;int

find

(int x)

intmain()

} cout

}

補完2題,發現牛客的思維難度還是挺高的,如果能夠推出結論,還是挺好寫**的,以後要多練練這種思維+演算法題目。

剛開始看還以為是個數論題數論渣渣不想看數論,其實是個dp

狀態表示:f[i

][j]

[0/1

]f[i][j][0/1]

f[i][j

][0/

1]表示對於前i

ii個人選擇j

jj個增加d

dd 並且不選/選擇第i

ii個人

狀態計算:

f [i

][j]

[0]=

f[i−

1][j

][0]

+(a[

i−1]

+d≤a

[i])

f[i−

1][j

][1]

f[i][j][0]=f[i-1][j][0]+(a[i-1]+d \leq a[i])f[i-1][j][1]

f[i][j

][0]

=f[i

−1][

j][0

]+(a

[i−1

]+d≤

a[i]

)f[i

−1][

j][1]f[

i][j

][1]

=f[i

−1][

j−1]

[0]+

f[i−

1][j

−1][

1]

f[i][j][1]=f[i-1][j-1][0]+f[i-1][j-1][1]

f[i][j

][1]

=f[i

−1][

j−1]

[0]+

f[i−

1][j

−1][

1]很多dp概率實質都是算方案數,然後借用階乘和逆元算答案。

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const

int n=

5010

;const ll mod=

998244353

;ll a[n]

,d;ll f[2]

[n][2]

;// f[i][j][0/1] 表示對於前i個人選擇j個增加d 並且不選/選擇第i個人

int n;

ll fact[n]

,infact[n]

;ll qmi

(ll a,ll b,ll p)

return res;

}void

init

(int n)

}int

main()

}for

(int i=

1;i<=n;i++

)}

要加油哦~

牛客練習賽69 B

題意 給定n nn個數,乙個x xx表示可以劃分成最多x xx個串,乙個y yy表示在乙個串中最多選擇y yy個數。最後求 i 1x j 1yv al i j sum x sum yval i,j i 1x j 1 y va l i,j v al i,j val i,j val i,j 為 將n n...

牛客練習賽69 D 火柴排隊

長度為 n nn 序列 a aa 中找出 k kk 個數加 d dd,使新序列中如果 ai aj a i a j ai aj 那麼原序列也 a i aj a i a j ai aj 的概率。對於每個 1 k n 1 le k le n 1 k n,你都要輸出其對應的答案,答案模 998244353 ...

牛客練習賽9

時間限制 c c 1秒,其他語言2秒 空間限制 c c 32768k,其他語言65536k 64bit io format lld 珂朵莉想每天都給威廉送禮物,於是她準備了n個自己的本子 她想送最多的天數,使得每天至少送乙個本子,但是相鄰兩天送的本子個數不能相同 珂朵莉最多送幾天禮物呢 第一行乙個整...