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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

P7988-[USACO21DEC] HILO G【set,线段树】

發(fā)布時(shí)間:2023/12/3 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P7988-[USACO21DEC] HILO G【set,线段树】 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

正題

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


題目大意

給出一個(gè)長(zhǎng)度為nnn的排列,開始有一個(gè)數(shù)字xxx,第一次詢問回答x<a1x<a_1x<a1?(記為LOLOLO)或者x>a1x>a_1x>a1?(記為HIHIHI),然后繼續(xù)往后問,如果aia_iai?不在范圍內(nèi)就不詢問,求對(duì)于每個(gè)k∈[0,n],x=k+0.5k\in [0,n],x=k+0.5k[0,n],x=k+0.5時(shí)回答串中HILOHILOHILO的個(gè)數(shù)。

1≤n≤2×1051\leq n\leq 2\times 10^51n2×105


解題思路

所有數(shù)一起考慮,考慮到序列里的每個(gè)詢問aia_iai?只有當(dāng)數(shù)字所在的區(qū)間包含aia_iai?時(shí)才會(huì)詢問,然后aia_iai?會(huì)把一個(gè)區(qū)間成兩個(gè)。

那么先考慮HIHIHI,假設(shè)第iii個(gè)詢問是HIHIHI,那么首先肯定有x<aix< a_ix<ai?,然后有x>aj(j∈[1,i?1],aj≤ai)x>a_j(j\in[1,i-1],a_j\leq a_i)x>aj?(j[1,i?1],aj?ai?)也就是還要在aia_iai?目前在的區(qū)間內(nèi)。

之后考慮這個(gè)HIHIHI的下一個(gè)能否是LOLOLO,首先它的下一個(gè)被詢問的位置肯定是在[max{aj},ai][\ max\{a_j\},a_i\ ][?max{aj?},ai??]這個(gè)范圍內(nèi)的aka_kak?。然后我們要的xxx就在[ak,ai][a_k,a_i][ak?,ai?]范圍內(nèi)。

setsetset求出每個(gè)aia_iai?對(duì)應(yīng)的max{aj}max\{a_j\}max{aj?}讓,然后反過來做用線段樹維護(hù)aka_kak?就好了。

時(shí)間復(fù)雜度:O(nlog?n)O(n\log n)O(nlogn)


code

#include<cstdio> #include<cstring> #include<algorithm> #include<set> using namespace std; const int N=2e5+10; int n,a[N],l[N],s[N],w[N<<2]; set<int> pre; void Change(int x,int L,int R,int pos,int val){w[x]=val;if(L==R)return;int mid=(L+R)>>1;if(pos<=mid)Change(x*2,L,mid,pos,val);else Change(x*2+1,mid+1,R,pos,val);return; } int Ask(int x,int L,int R,int l,int r){if(L==l&&R==r)return w[x];int mid=(L+R)>>1;if(r<=mid)return Ask(x*2,L,mid,l,r);if(l>mid)return Ask(x*2+1,mid+1,R,l,r);return min(Ask(x*2,L,mid,l,mid),Ask(x*2+1,mid+1,R,mid+1,r)); } int main() {scanf("%d",&n);pre.insert(0);pre.insert(n+1);for(int i=1;i<=n;i++){scanf("%d",&a[i]);l[i]=*(--pre.upper_bound(a[i]));pre.insert(a[i]);}for(int i=0;i<=n+1;i++)Change(1,0,n+1,i,n+1);for(int i=n;i>=1;i--){int k=a[Ask(1,0,n+1,l[i],a[i])];if(k){s[a[Ask(1,0,n+1,l[i],a[i])]]++;s[a[i]]--;}Change(1,0,n+1,a[i],i);}for(int i=1;i<=n;i++)s[i]+=s[i-1];for(int i=0;i<=n;i++)printf("%d\n",s[i]);return 0; }

總結(jié)

以上是生活随笔為你收集整理的P7988-[USACO21DEC] HILO G【set,线段树】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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