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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

P5072-[Ynoi2015]盼君勿忘【莫队,根号分治】

發布時間:2023/12/3 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P5072-[Ynoi2015]盼君勿忘【莫队,根号分治】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題

題目鏈接:https://www.luogu.com.cn/problem/P5072


題目大意

nnn個數,mmm個詢問(l,r,p)(l,r,p)(l,r,p)表示詢問[l,r][l,r][l,r]的所有子序列的和模ppp


解題思路

一個出現了kkk次的數會產生貢獻2r?l+1?2r?l+1?k2^{r-l+1}-2^{r-l+1-k}2r?l+1?2r?l+1?k次貢獻。那么我們設ziz_izi?表示出現了iii次的數字和。這樣可以O(nm)O(nm)O(nm)統計答案。

考慮根號分治,我們把出現小于n\sqrt nn?的數用桶來統計,次數大于n\sqrt nn?的數用setsetset維護,這樣的數最多只會有n\sqrt nn?個。

考慮如何預處理2i%p2^i\% p2i%p,我們可以先預處理20,21,22,...2n,22n...2^0,2^1,2^2,...2^{\sqrt n},2^{2\sqrt n}...20,21,22,...2n?,22n?...的值,然后詢問時拆成兩部分即可,這樣的時間復雜度也是O(nn)O(n\sqrt n)O(nn?)的。

所以時間復雜度為O(nn)O(n\sqrt n)O(nn?)


codecodecode

#include<bits/stdc++.h> using namespace std; const int N=1e5+10,siz=317; struct node{int l,r,p,id; }q[N]; int n,m,T,a[N],ans[N],b[N]; int z[N],v[N],q2[N],p2[N]; set<int> s; bool cmp(node x,node y){if(x.l/T==y.l/T)return x.r<y.r;return x.l<y.l; } void add(int x){z[v[x]]-=b[x];if(v[x]==siz)s.insert(x);v[x]++;z[v[x]]+=b[x];return; } void del(int x){z[v[x]]-=b[x];v[x]--;if(v[x]==siz)s.erase(x);z[v[x]]+=b[x];return; } int power(int x,int p) {return 1ll*q2[x/siz]*p2[x%siz]%p;} int main() {scanf("%d%d",&n,&m);T=sqrt(n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);b[i]=a[i];}sort(b+1,b+1+n);int cnt=unique(b+1,b+1+n)-b-1;for(int i=1;i<=n;i++)a[i]=lower_bound(b+1,b+1+cnt,a[i])-b;for(int i=1;i<=m;i++)scanf("%d%d%d",&q[i].l,&q[i].r,&q[i].p),q[i].id=i;sort(q+1,q+1+m,cmp);int l=1,r=0;set<int>::iterator it;for(int x=1;x<=m;x++){while(r<q[x].r)add(a[++r]);while(l>q[x].l)add(a[--l]);while(r>q[x].r)del(a[r--]);while(l<q[x].l)del(a[l++]);p2[0]=1;for(int i=1;i<=siz;i++)p2[i]=p2[i-1]*2%q[x].p;q2[1]=p2[siz];q2[0]=1;for(int i=2;i<=siz;i++)q2[i]=1ll*q2[i-1]*q2[1]%q[x].p;int pw=power(r-l+1,q[x].p),answer=0,P=q[x].p;for(int i=1;i<=siz;i++)answer=(answer+1ll*(pw-power(r-l+1-i,P)+P)%P*z[i]%P)%P;for(it=s.begin();it!=s.end();it++)answer=(answer+1ll*(pw-power(r-l+1-v[*it],P)+P)%P*b[*it]%P)%P;ans[q[x].id]=answer;}for(int i=1;i<=m;i++)printf("%d\n",ans[i]);return 0; }

總結

以上是生活随笔為你收集整理的P5072-[Ynoi2015]盼君勿忘【莫队,根号分治】的全部內容,希望文章能夠幫你解決所遇到的問題。

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