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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

数据结构:莫队

發布時間:2023/12/9 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构:莫队 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

莫隊算法是用來處理一類無修改的離線區間詢問問題

莫隊的精髓就在于,離線得到了一堆需要處理的區間后,合理的安排這些區間計算的次序以得到一個較優的復雜度

代表題目是BZOJ2038這道題

?進行區間詢問[l,r],輸出該區間內隨機抽兩次抽到相同顏色襪子的概率

分母就是n*n(表示兩兩襪子之間的隨機組合),分子是一個累加和,累加的內容是該區間內每種顏色i出現次數sum[i]的平方

只需要用莫隊處理每個區間內不同數字的平方和就好了

如果我們已知[l,r]的答案,能在O(1)時間得到[l+1,r]的答案以及[l,r-1]的答案,即可使用莫隊算法

如果已知[l,r]的答案,要求[l’,r’]的答案,我們很容易通過|l – l’|+|r – r’|次轉移內求得

將n個數分成sqrt(n)塊

按區間排序,以左端點所在塊內為第一關鍵字,右端點為第二關鍵字,進行排序

排序之后直接暴力就可以了

1 #include<cstdio> 2 #include<cmath> 3 #include<algorithm> 4 using namespace std; 5 const int maxn=50005; 6 int n,m; 7 int pos[maxn],c[maxn]; 8 long long ans; 9 long long s[maxn]; 10 struct Data 11 { 12 int l,r,id; 13 long long a,b; 14 }a[maxn]; 15 long long gcd(long long a,long long b) 16 { 17 return b==0?a:gcd(b,a%b); 18 } 19 bool cmp(Data a,Data b) 20 { 21 if(pos[a.l]==pos[b.l]) return a.r<b.r; 22 return a.l<b.l; 23 } 24 bool cmp_id(Data a,Data b) 25 { 26 return a.id<b.id; 27 } 28 void update(int p,int add) 29 { 30 ans-=s[c[p]]*s[c[p]]; 31 s[c[p]]+=add; 32 ans+=s[c[p]]*s[c[p]]; 33 } 34 void solve() 35 { 36 for(int i=1,l=1,r=0;i<=m;i++) 37 { 38 for(;r<a[i].r;r++) update(r+1,1); 39 for(;r>a[i].r;r--) update(r,-1); 40 for(;l<a[i].l;l++) update(l,-1); 41 for(;l>a[i].l;l--) update(l-1,1); 42 if(a[i].l==a[i].r) 43 { 44 a[i].a=0;a[i].b=1; 45 continue; 46 } 47 a[i].a=ans-(a[i].r-a[i].l+1); 48 a[i].b=(long long)(a[i].r-a[i].l+1)*(a[i].r-a[i].l); 49 long long k=gcd(a[i].a,a[i].b); 50 a[i].a/=k;a[i].b/=k; 51 } 52 } 53 int main() 54 { 55 scanf("%d%d",&n,&m); 56 for(int i=1;i<=n;i++) scanf("%d",&c[i]); 57 int block=int(sqrt(n)); 58 for(int i=1;i<=n;i++) pos[i]=(i-1)/block+1; 59 for(int i=1;i<=m;i++) 60 { 61 scanf("%d%d",&a[i].l,&a[i].r); 62 a[i].id=i; 63 } 64 sort(a+1,a+m+1,cmp); 65 solve(); 66 sort(a+1,a+m+1,cmp_id); 67 for(int i=1;i<=m;i++) 68 printf("%lld/%lld\n",a[i].a,a[i].b); 69 return 0; 70 }

?

轉載于:https://www.cnblogs.com/aininot260/p/9524763.html

總結

以上是生活随笔為你收集整理的数据结构:莫队的全部內容,希望文章能夠幫你解決所遇到的問題。

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