日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BZOJ-2038-小Z的袜子hose-莫队

發布時間:2025/3/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ-2038-小Z的袜子hose-莫队 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

描述

  • 每個詢問在一行中輸出分數A/B表示從該詢問的區間[L,R]中隨機抽出兩只襪子顏色相同的概率。

分析
  • 區間無修改的題目, 只需要求出各種顏色的數量即可, 所以可以用莫隊.
  • 如果一種顏色 i 在區間 [L, R] 內的數目是 c[i], 那么隨機抽出兩只襪子顏色相同的概率等于 ΣC(c[i], 2) / C(R-L+1, 2).
  • 發現組合數的 m 位置都是2, 所以直接展開來算, 得到?Σc[i]*(c[i]-1) / [(R-L+1)*(R-L)].
  • 這樣分母我們已知, 分子可以通過狀態轉移得到, 每次如果新加入一個結點, 顏色為 a, 則先減掉原來 a 對分子的貢獻即 c[i]*(c[i]-1), 然后++c[i], 再讓分子加上現在 a顏色對分子的貢獻, 即 c[i]*(c[i]-1). 刪掉一個結點類似. 所以就用 O(1) 的時間從 [L, R] 轉移到了 [L-1, R] 或者 [L+1, R] 或者 [L, R-1] 或者 [L, R+1].
  • 再計算分子分母的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; }


總結

以上是生活随笔為你收集整理的BZOJ-2038-小Z的袜子hose-莫队的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。