bzoj 2038 小Z的襪子 hose

2021-07-04 08:11:01 字數 957 閱讀 6817

題意:

給出乙個長度為n的序列,每次詢問乙個區間[l,r];

查詢在這個區間中取出兩個數恰好相等的概率;

每個數大小在[0,n]內,概率用既約分數表示;

題解:

考慮乙個區間的答案,顯然是合法方案數/取數的所有可能;

也就是 ∑c[同種數字個數][2]/c[r-l+1][2];

但是這個東西對一次詢問的處理複雜度是o(r-l+1)的;

那麼考慮上莫隊演算法,處理這樣的區間問題;

很容易發現每次修改邊界可以做到o(1)完成;

void update(int x,int op) 

c[i][j]是組合數,s[x]是當前區間x的數量,now是當前答案;

然後將詢問排序處理,第一關鍵字左端點所在塊,第二關鍵字右端點;

當塊的大小為√n時,可以證明複雜度不會超過o(n√n);

然後每個區間轉移到下乙個區間就是有複雜度保證的暴力咯;

碼量似乎不算太巨大,思想也比較簡單,很神的暴力演算法;

**:

#include#include#include#include#define n 51000 

using namespace std;

struct query

q[n];

int a[n],s[n],ans_up[n],ans_do[n],c[n][3],now;

bool cmp(query a,query b)

for(i=1;i<=m;i++)

return 0;

}

BZOJ2038 小Z的襪子 莫隊

bzoj2038 題意 q 5000 次詢問,問在區間中隨意取兩個值,這兩個值恰好相同的概率是多少?分數表示 感覺自己複述的題意極度抽象,還是原題意有趣 逃 思路 設在l到r這個區間中,x這個值得個數為a個,y這個值的個數為b個,z這個值的個數為c個。那麼答案即為 a a 1 2 b b 1 2 c...

BZOJ 2038 小Z的襪子(莫隊演算法)

莫隊演算法的話,看這個比較好懂 net bossup article details 39236275 不過這裡面的部落格的 貌似有點問題,所以 的話,net lwt36 article details 50583757 這個是對的,看我的也行。什麼時候用莫隊?1 區間不會被修改 2 可以離線 3 ...

BZOJ2038,小Z的襪子(莫隊演算法)

莫隊演算法。這道題wa了很多次,猜測可能是跟oj系統有關,有點坑。如下 include include include includeusing namespace std typedef long long ll const int maxn 5e4 5 const int mm 2e6 5 in...