BZOJ2038 小Z的襪子 莫隊

2022-05-01 15:09:18 字數 3013 閱讀 7317

bzoj2038

題意:q(5000)次詢問,問在區間中隨意取兩個值,這兩個值恰好相同的概率是多少?分數表示;

感覺自己複述的題意極度抽象,還是原題意有趣(逃;

思路:設在l到r這個區間中,x這個值得個數為a個,y這個值的個數為b個,z這個值的個數為c個。

那麼答案即為 (a*(a-1)/2+b*(b-1)/2+c*(c-1)/2....)/((r-l+1)*(r-l)/2)

化簡得: (a^2+b^2+c^2+...x^2-(a+b+c+.....)) / ((r-l+1)*(r-l))

顯然其中(a+b+c+.....)就是區間的長度,每個值得個數總和。

即: (a^2+b^2+c^2+...x^2-(r-l+1))/((r-l+1)*(r-l))

每次sum記錄a^2+b^2+c^2+...x^2,用莫隊轉移即可。

#include #include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

//#pragma comment(linker, "/stack:102400000,102400000")

//c++

#define lson (l , mid , rt << 1)

#define rson (mid + 1 , r , rt << 1 | 1)

#define debug(x) cerr << #x << " = " << x << "\n";

#define pb push_back

#define pq priority_queuetypedef

long

long

ll;typedef unsigned

long

long

ull;

typedef pair

pll;

typedef pair

pii;

//priority_queueq;

//這是乙個大根堆q

//priority_queue,greater>q;

//這是乙個小根堆q

#define fi first

#define se second

#define endl '\n'

#define okc ios::sync_with_stdio(false);cin.tie(0)

#define ft(a,b,c) for(int a=b;a <= c;++a) //

用來壓行

#define rep(i , j , k) for(int i = j ; i < k ; ++i)

//priority_queue, greater>que;

const ll mos = 0x7fffffff; //

2147483647

const ll nmos = 0x80000000; //

-2147483648

const

int inf = 0x3f3f3f3f

;const ll inff = 0x3f3f3f3f3f3f3f3f; //

18template

inline t read(t&x)

//#define _debug; //*

//#ifdef _debug

freopen(

"input

", "r"

, stdin);

//freopen("output.txt", "w", stdout);

#endif

/*-----------------------show time----------------------

*/const

int b = 233

;

#define bel(x) ((x-1)/b + 1)

intn,m;

ll sum = 0

;

const

int maxn = 50009

;

struct

node

q[maxn];

struct

resans[maxn];

intcnt[maxn],col[maxn];

bool

cmp(node a,node b)

return bel(a.le)

}void del(int

x)

void add(int

x)int

main()

sort(q+1,q+1+m,cmp);

int pl = 1, pr = 0

; sum = 0

;

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

ans[q[i].id].a = sum - (q[i].ri - q[i].le + 1

); ans[q[i].id].b = (q[i].ri - q[i].le + 1) * (q[i].ri -q[i].le);

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

else printf("

%lld/%lld\n

", ans[i].a/tmp, ans[i].b/tmp);

}return0;

}

bzoj2038

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...

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

題目 分析 莫隊演算法 莫隊演算法是一種思想 處理問題 不帶修改的區間詢問 使用要求 l 1,r l,r 1 的結果可由 l,r 的答案在o 1 或o logn 的時間內推出 具體步驟 1 對整個區間軸分成根號n塊 2 以l所在的塊的編號為第一關鍵字,r為第二關鍵字給所有詢問排序方便處理 3 對於每...