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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[Ynoi2019模拟赛]Yuno loves sqrt technology II

發(fā)布時(shí)間:2025/7/25 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Ynoi2019模拟赛]Yuno loves sqrt technology II 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目大意:

給定一個(gè)數(shù)列,每次詢問區(qū)間逆序?qū)?shù),不強(qiáng)制在線。

題解:

如果不強(qiáng)制在線的話,我們可以離線下來搞一個(gè)莫隊(duì),每次指針左右移動(dòng)的時(shí)候相當(dāng)于查當(dāng)前區(qū)間中有多少數(shù)比它大或者有多少數(shù)比它小,這個(gè)需要用樹狀數(shù)組維護(hù),時(shí)間復(fù)雜度\(O(n\sqrt{n}logn)\)。

但是\(300ms\)跑不出來。。。

于是我們觀察指針左右移動(dòng)的時(shí)候我們都需要查詢些什么?

比如說左端點(diǎn)向左移動(dòng),我們相當(dāng)于是查詢\(l \sim r\)中有多少數(shù)比\(a[l-1]\)小。

然后搞成前綴和相減,弄成\(1\sim r\)\(1 \sim l-1\),觀察到后面那個(gè)是\(1\sim l-1\)中有多少個(gè)數(shù)比\(a[l-1]\)小,這個(gè)東西只有一個(gè)變量,所以可以提前預(yù)處理出來。

那么我們只有前一種問題了。

我們再次把這些問題離線,每個(gè)詢問掛到\(r\)上,然后依次從\(1-n\)掃描,然后再進(jìn)行分塊,每次添加一個(gè)數(shù)可以\(\sqrt n\)的做,這樣查詢可以做到\(O(1)\),于是我們的總復(fù)雜度是\(O(m\sqrt n+n\sqrt n)\)。

注意到我們的總詢問有\(m\sqrt n\)個(gè),\(32MB\)存不下。。

毒瘤出題人。

注意到每次指針移動(dòng)會(huì)是一段區(qū)間,所以每次存詢問的時(shí)候直接把整段區(qū)間存下來就好了,所以空間就是\(O(m)\)的了。

#include<bits/stdc++.h> #define N 100009 using namespace std; typedef long long ll; int n,n1,q,be[N],c[N],bl[N],bel,a[N]; int sum1[N],sum0[N],san0[N],san1[N],pre0[N],pre1[N],ys[N]; ll ans[N]; inline ll rd(){ll x=0;char c=getchar();bool f=0;while(!isdigit(c)){if(c=='-')f=1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}return f?-x:x; } struct node{int l,r,id;inline bool operator <(const node &b)const{if(be[l]!=be[b.l])return be[l]<be[b.l];return (be[l]&1)?r<b.r:r>b.r;} }b[N]; struct node2{int be,l,r,tag,opt; }; vector<node2>vec[N]; vector<node2>::iterator it; struct BIT{int tr[N];inline void add(int x,int y){while(x<=n)tr[x]+=y,x+=x&-x;}inline int query(int x){int ans=0;while(x)ans+=tr[x],x-=x&-x;return ans;}inline void clear(){memset(tr,0,sizeof(tr));} }tr; int main(){n=rd();q=rd();n1=sqrt(n);for(int i=1;i<=n;++i)a[i]=rd(),c[++c[0]]=a[i];sort(c+1,c+c[0]+1);c[0]=unique(c+1,c+c[0]+1)-c-1;for(int i=1;i<=n;++i)a[i]=lower_bound(c+1,c+c[0]+1,a[i])-c;for(int i=1;i<=n;++i){pre0[i]=tr.query(a[i]-1);tr.add(a[i],1);}tr.clear();for(int i=1;i<=n;++i){pre1[i]=tr.query(n-a[i]);tr.add(n-a[i]+1,1);}for(int i=1;i<=n;++i)be[i]=(i-1)/n1+1;for(int i=1;i<=q;++i){b[i].l=rd();b[i].r=rd();b[i].id=i;}sort(b+1,b+q+1);int l=1,r=1;for(int i=1;i<=q;++i){while(l>b[i].l){for(int j=b[i].l;j<l;++j){ans[i]-=pre0[j];}vec[r].push_back(node2{i,b[i].l,l-1,0,1});l=b[i].l;}while(r<b[i].r){for(int j=r+1;j<=b[i].r;++j){ans[i]+=pre1[j];}if(l!=1){vec[l-1].push_back(node2{i,r+1,b[i].r,1,-1});} r=b[i].r;}while(l<b[i].l){for(int j=l;j<b[i].l;++j){ans[i]+=pre0[j];}vec[r].push_back(node2{i,l,b[i].l-1,0,-1});l=b[i].l;} while(r>b[i].r){for(int j=b[i].r+1;j<=r;++j){ans[i]-=pre1[j];}vec[l-1].push_back(node2{i,b[i].r+1,r,1,1});r=b[i].r;}ys[b[i].id]=i;}int bel=sqrt(c[0]);for(int i=1;i<=c[0];++i)bl[i]=(i-1)/bel+1;for(int i=1;i<=n;++i){int now=bl[a[i]];for(int j=now;j<=bl[c[0]];++j)sum0[j]++;for(int j=a[i];j<=min(c[0],bel*now);++j)san0[j]++;now=bl[c[0]-a[i]+1];for(int j=now;j<=bl[c[0]];++j)sum1[j]++;for(int j=c[0]-a[i]+1;j<=min(c[0],bel*now);++j)san1[j]++;for(it=vec[i].begin();it!=vec[i].end();++it){node2 x=*it;if(!x.tag){int tmp=0;for(int j=x.l;j<=x.r;++j){int now=bl[a[j]];int xx=sum0[now-1];if(bl[a[j]-1]==bl[a[j]])xx+=san0[a[j]-1];tmp+=xx;ans[x.be]+=x.opt*xx;} }else{int tmp=0;for(int j=x.l;j<=x.r;++j){int now=bl[c[0]-a[j]+1];int xx=sum1[now-1];tmp+=xx;if(bl[c[0]-a[j]]==bl[c[0]-a[j]+1])xx+=san1[c[0]-a[j]];ans[x.be]+=x.opt*xx;}}}}for(int i=1;i<=q;++i)ans[i]+=ans[i-1];for(int i=1;i<=q;++i)printf("%lld\n",ans[ys[i]]);return 0; }

轉(zhuǎn)載于:https://www.cnblogs.com/ZH-comld/p/10889603.html

《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的[Ynoi2019模拟赛]Yuno loves sqrt technology II的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。