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

1|0正题

题目链接:https://www.luogu.com.cn/problem/P7988


1|1题目大意

给出一个长度为n的排列,开始有一个数字x,第一次询问回答x<a1(记为LO)或者x>a1(记为HI),然后继续往后问,如果ai不在范围内就不询问,求对于每个k[0,n],x=k+0.5时回答串中HILO的个数。

1n2×105


1|2解题思路

所有数一起考虑,考虑到序列里的每个询问ai只有当数字所在的区间包含ai时才会询问,然后ai会把一个区间成两个。

那么先考虑HI,假设第i个询问是HI,那么首先肯定有x<ai,然后有x>aj(j[1,i1],ajai)也就是还要在ai目前在的区间内。

之后考虑这个HI的下一个能否是LO,首先它的下一个被询问的位置肯定是在[ max{aj},ai ]这个范围内的ak。然后我们要的x就在[ak,ai]范围内。

set求出每个ai对应的max{aj}让,然后反过来做用线段树维护ak就好了。

时间复杂度:O(nlogn)


1|3code

#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; }

__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/15763218.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示