BZOJ-2038-小Z的袜子hose-莫队
生活随笔
收集整理的這篇文章主要介紹了
BZOJ-2038-小Z的袜子hose-莫队
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
描述
- 每個(gè)詢問在一行中輸出分?jǐn)?shù)A/B表示從該詢問的區(qū)間[L,R]中隨機(jī)抽出兩只襪子顏色相同的概率。
分析
- 區(qū)間無修改的題目, 只需要求出各種顏色的數(shù)量即可, 所以可以用莫隊(duì).
- 如果一種顏色 i 在區(qū)間 [L, R] 內(nèi)的數(shù)目是 c[i], 那么隨機(jī)抽出兩只襪子顏色相同的概率等于 ΣC(c[i], 2) / C(R-L+1, 2).
- 發(fā)現(xiàn)組合數(shù)的 m 位置都是2, 所以直接展開來算, 得到?Σc[i]*(c[i]-1) / [(R-L+1)*(R-L)].
- 這樣分母我們已知, 分子可以通過狀態(tài)轉(zhuǎn)移得到, 每次如果新加入一個(gè)結(jié)點(diǎn), 顏色為 a, 則先減掉原來 a 對(duì)分子的貢獻(xiàn)即 c[i]*(c[i]-1), 然后++c[i], 再讓分子加上現(xiàn)在 a顏色對(duì)分子的貢獻(xiàn), 即 c[i]*(c[i]-1). 刪掉一個(gè)結(jié)點(diǎn)類似. 所以就用 O(1) 的時(shí)間從 [L, R] 轉(zhuǎn)移到了 [L-1, R] 或者 [L+1, R] 或者 [L, R-1] 或者 [L, R+1].
- 再計(jì)算分子分母的gcd即可
- 不要忘記開 long long.
#include #include #include using namespace std; typedef long long int lli;const int maxn = 50000 + 10;int size; int A[maxn]; int c[maxn]; lli X[maxn], Y[maxn];struct Query {int L, R, id;bool operator < (const Query& rhs) const {if(L/size != rhs.L/size) return L < rhs.L;return R < rhs.R;} } Q[maxn];#define q Q[i]lli gcd(lli a, lli b) {return b == 0 ? a : gcd(b, a % b); }int main() {int n, m;scanf("%d %d", &n, &m);for(int i = 1; i <= n; i++)scanf("%d", &A[i]);for(int i = 1; i <= m; i++)scanf("%d %d", &q.L, &q.R), q.id = i;size = sqrt(n);sort(Q+1, Q+m+1);int L = 1, R = 0;lli x = 0;for(int i = 1; i <= m; i++) {while(L < q.L) {x -= (lli) c[A[L]] * (c[A[L]]-1);c[A[L]]--;x += (lli) c[A[L]] * (c[A[L]]-1);L++;}while(R > q.R) {x -= (lli) c[A[R]] * (c[A[R]]-1);c[A[R]]--;x += (lli) c[A[R]] * (c[A[R]]-1);R--;}while(L > q.L) {L--;x -= (lli) c[A[L]] * (c[A[L]]-1);c[A[L]]++;x += (lli) c[A[L]] * (c[A[L]]-1);}while(R < q.R) {R++;x -= (lli) c[A[R]] * (c[A[R]]-1);c[A[R]]++;x += (lli) c[A[R]] * (c[A[R]]-1);}if(x == 0) {X[q.id] = 0;Y[q.id] = 1;continue;}X[q.id] = x;Y[q.id] = (lli)(q.R-q.L+1) * (q.R-q.L);lli g = gcd(X[q.id], Y[q.id]);X[q.id] /= g;Y[q.id] /= g;}for(int i = 1; i <= m; i++) printf("%lld/%lld\n", X[i], Y[i]);return 0; }
總結(jié)
以上是生活随笔為你收集整理的BZOJ-2038-小Z的袜子hose-莫队的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BZOJ-3190-赛车-JLOI201
- 下一篇: COGS-257-动态排名系统-树状数组