JXOI2018 排序問題

2021-10-01 11:14:08 字數 1859 閱讀 8042

點此看題

0x01 50分暴力

先考慮得到乙個序列計算它的期望,如果這個序列兩兩不同,假設長度為n

nn,那麼期望就是n!n!

n!,考慮序列有重複的情況,發現相同的數的順序不用考慮,設每個數的出現次數為t

it_i

ti​,那麼期望就是n!/

ti

!n!/t_i!

n!/ti​

!。在考慮如果加入數字,觀察上面期望的式子,發現在[l,

r]

[l,r]

[l,r

]出現數的總和一定的情況下分布越平均越好,這樣就得到了乙個暴力的寫法,向[l,

r]

[l,r]

[l,r

]中暴力填數,保證盡量出現的數平均,然後按照上式計算答案。

0x02 二分

因為盡量平均,有乙個單調性,可以考慮二分,二分平均出現的次數,然後計算達到這個次數的情況下填數的次數,把這個找到不大於m

mm的最大的平均出現次數,具體操作是找到a

aa陣列中的[l,

r]

[l,r]

[l,r

]的數生成b

bb陣列,二分之後分成三部分計算,設二分的答案是p

pp,第一部分就是還剩下的次數用上去,就是fac

[p+1

]fac[p+1]

fac[p+

1],第二部分就是平均的出現次數,就是fac

[p

]fac[p]

fac[p]

,第三部分是a

aa陣列**現次數大於p

pp的,單獨考慮。

第一次在考試中切掉紫題qwq,太激動了,不知所言。

#include

#include

using

namespace std;

#define int long long

const

int maxn =

200005

;const

int maxm =

11000005

;const

int mod =

998244353

;int

read()

int t,n,m,k,l,r,cnt,ans,p,a[maxn]

,b[maxn]

;int fac[maxm]

;void

init()

intqkpow

(int a,

int b)

return res;

}int

check

(int x)

void

solve

(int l,

int r)

else

solve

(l,mid-1)

;}intinv

(int x)

signed

main()

}solve(0

,1e8);

m-=check

(p);

for(

int i=

1;i<=k;i++)if

(b[i]

>p)

ans=ans*

qkpow

(inv

(p+1

),m)

%mod*

qkpow

(inv

(p),r-l+

1-m-cnt)

%mod;

printf

("%lld\n"

,ans);}

}

BZOJ5322 JXOI2018 排序問題

傳送門 不難看出期望就是 n m v 1m ax c ntv frac cnt v v 1ma x c ntv n m cntv cnt v cntv 表示 v vv 這個數出現的次數。貪心就是直接把 m mm 個數字每次選擇乙個 cnt cntcn t 最小的加入,使得最後 l,r l,r l,r...

JXOI2018簡要題解

考慮如果所有數都不同,那麼一定只有一種方案可行,需要 n 次 如果有數相同,考慮強制大小關係,最後除上每個相同數之內的排列個數 考慮如何加入新的數,明顯是越平均越好,模擬一下即可 複雜度為 o tn log n include define n 200005 define m 10000005 de...

洛谷 JXOI2018 遊戲

初見安 這裡是傳送門 洛谷p4562 遊戲 九條可憐是乙個富有的女孩子。她長大以後創業了,開了乙個公司。但是管理公司是乙個很累人的活,員工們經常揹著可憐偷懶,可憐需要時不時對辦公室進行檢查。可憐公司有 nn 個辦公室,辦公室編號是 l到 l n 1,可憐會事先制定乙個順序,按照這個順序依次檢查辦公室...