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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

P5268-[SNOI2017]一个简单的询问【莫队】

發布時間:2023/12/3 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P5268-[SNOI2017]一个简单的询问【莫队】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題

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


題目大意

nnn個數的一個序列,定義get(l1,r1,x)get(l_1,r_1,x)get(l1?,r1?,x)表示區間[l1,r1][l_1,r_1][l1?,r1?]中有多少個xxx

每次詢問(l1,r1,l2,r2)(l_1,r_1,l_2,r_2)(l1?,r1?,l2?,r2?)∑x∞get(l1,r1,x)?get(l2,r2,x)\sum_{x}^{\infty}get(l_1,r_1,x)*get(l_2,r_2,x)x?get(l1?,r1?,x)?get(l2?,r2?,x)


解題思路

考慮莫隊,有get(l1,r1,x)?get(l2,r2,x)get(l_1,r_1,x)*get(l_2,r_2,x)get(l1?,r1?,x)?get(l2?,r2?,x)

===

get(1,r1,x)?get(1,r2,x)?get(1,l1?1,x)?get(1,r2,x)get(1,r_1,x)*get(1,r_2,x)-get(1,l_1-1,x)*get(1,r_2,x)get(1,r1?,x)?get(1,r2?,x)?get(1,l1??1,x)?get(1,r2?,x)?get(1,r1,x)?get(1,l2?1,x)+get(1,l1?1,x)?get(1,l2?1,x)-get(1,r_1,x)*get(1,l_2-1,x)+get(1,l_1-1,x)*get(1,l_2-1,x)?get(1,r1?,x)?get(1,l2??1,x)+get(1,l1??1,x)?get(1,l2??1,x)

然后分成四次莫隊就好了


codecodecode

#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const int N=5e4+10; struct node{int l,r,id,w; }q[N*4]; int n,cnt,T,Q,a[N],ans[N],v1[N],v2[N]; bool cmp(node x,node y) {return x.l/T<y.l/T||(x.l/T==y.l/T&&x.r<y.r);} int main() {scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]);T=sqrt(n);scanf("%d",&Q);for(int i=1;i<=Q;i++){int l1,r1,l2,r2;scanf("%d%d%d%d",&l1,&r1,&l2,&r2);q[++cnt]=(node){r1,r2,i,1};q[++cnt]=(node){r1,l2-1,i,-1};q[++cnt]=(node){l1-1,r2,i,-1};q[++cnt]=(node){l1-1,l2-1,i,1};}sort(q+1,q+1+cnt,cmp);int l=0,r=0,val=0;for(int i=1;i<=cnt;i++){while(r<q[i].r)++r,v2[a[r]]++,val+=v1[a[r]];while(r>q[i].r)v2[a[r]]--,val-=v1[a[r]],r--;while(l<q[i].l)++l,v1[a[l]]++,val+=v2[a[l]];while(l>q[i].l)v1[a[l]]--,val-=v2[a[l]],l--;ans[q[i].id]+=q[i].w*val;}for(int i=1;i<=Q;i++)printf("%d\n",ans[i]);}

總結

以上是生活随笔為你收集整理的P5268-[SNOI2017]一个简单的询问【莫队】的全部內容,希望文章能夠幫你解決所遇到的問題。

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