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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

莫队算法 BOJ 2038 [2009国家集训队]小Z的袜子(hose)

發布時間:2023/12/2 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 莫队算法 BOJ 2038 [2009国家集训队]小Z的袜子(hose) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

題目傳送門

1 /* 2 莫隊算法:求出[l, r]上取出兩只相同襪子的個數。 3 莫隊算法是離線處理一類區間不修改查詢類問題的算法。如果你知道了[L,R]的答案,可以在O(1)的時間下得到 4 [L,R-1]和[L,R+1]和[L-1,R]和[L+1,R],4個while是精華! 5 對于莫隊算法我感覺就是暴力。只是預先知道了所有的詢問??梢院侠淼慕M織計算每個詢問的順序以此來降低復雜度。 6 詳細解釋:http://blog.csdn.net/bossup/article/details/39236275 7 */ 8 #include <cstdio> 9 #include <cstring> 10 #include <algorithm> 11 #include <cmath> 12 using namespace std; 13 14 typedef long long ll; 15 const int MAXN = 5e4 + 10; 16 const int INF = 0x3f3f3f3f; 17 struct Data 18 { 19 int b, l, r, id; 20 ll x, y; 21 Data () {} 22 Data (int b, ll l, ll r, int id) : b (b), l (l), r (r), id (id) {}; 23 }data[MAXN]; 24 int cnt[MAXN]; 25 int a[MAXN]; 26 int n, m; 27 ll ans; 28 29 bool cmp_pre(Data x, Data y) 30 { 31 if (x.b == y.b) return x.r < y.r; 32 return x.b < y.b; 33 } 34 35 bool cmp_id(Data x, Data y) {return x.id < y.id;} 36 37 ll cal(int v) {return (ll) v * v;} 38 39 void updata(int v, int add) 40 { 41 ans -= cal (cnt[v]); 42 cnt[v] += add; 43 ans += cal (cnt[v]); 44 } 45 46 ll GCD(ll a, ll b) {return b == 0 ? a : GCD (b, a % b);} 47 48 void Modui(void) 49 { 50 sort (data+1, data+1+m, cmp_pre); 51 memset (cnt, 0, sizeof (cnt)); 52 53 int l = 1, r = 0; ans = 0; 54 for (int i=1; i<=m; ++i) 55 { 56 while (data[i].l < l) updata (a[--l], 1); 57 while (data[i].l > l) updata (a[l], -1), l++; 58 while (data[i].r > r) updata (a[++r], 1); 59 while (data[i].r < r) updata (a[r], -1), r--; 60 61 if (data[i].l == data[i].r) 62 { 63 data[i].x = 0; data[i].y = 1; 64 continue; 65 } 66 data[i].x = ans - (data[i].r - data[i].l + 1); 67 data[i].y = (ll) (data[i].r - data[i].l + 1) * (data[i].r - data[i].l); 68 ll k = GCD (data[i].x, data[i].y); 69 data[i].x /= k; data[i].y /= k; 70 } 71 72 sort (data+1, data+1+m, cmp_id); 73 for (int i=1; i<=m; ++i) 74 { 75 printf ("%lld/%lld\n", data[i].x, data[i].y); 76 } 77 } 78 79 int main(void) //BOJ 2038 [2009國家集訓隊]小Z的襪子(hose) 80 { 81 // freopen ("BZOJ_2038.in", "r", stdin); 82 83 while (scanf ("%d%d", &n, &m) == 2) 84 { 85 for (int i=1; i<=n; ++i) scanf ("%d", &a[i]); 86 87 int block = (int) sqrt (n * 1.0); 88 for (int i=1; i<=m; ++i) 89 { 90 int l, r; 91 scanf ("%d%d", &l, &r); 92 data[i] = Data (l / block, l, r, i); 93 } 94 95 Modui (); 96 } 97 98 return 0; 99 }

?

轉載于:https://www.cnblogs.com/Running-Time/p/4644747.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的莫队算法 BOJ 2038 [2009国家集训队]小Z的袜子(hose)的全部內容,希望文章能夠幫你解決所遇到的問題。

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