P5012-水の数列【并查集,RMQ】

1|0正题

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


1|1题目大意

n个数字的一个序列,T次询问给出[l,r]要求

  • 找出一个最大的x满足。提出所有的小于x的数,然后被提出的数的连续区间长度平方和除以x的值最大
  • 要求分出来的区间个数在[l,r]之间
  • 强制在线

1n106,1T103,1ai106


1|2解题思路

考虑到x的取值不会超过[1,106],所以暴力枚举x,然后用并查集合并区间计算出每个x的区间个数和长度平方和。

然后丢到对应位置跑RMQ就好了。

时间复杂度O(nlogn+Q)


1|3code

#include<cstdio> #include<cstring> #include<algorithm> #include<vector> #define ll long long using namespace std; const ll N=1e6+10; ll n,T,lg[N/2],fa[N],siz[N],w[N]; ll ans,L,f[N/2][20],co[N]; vector<ll> v[N];bool k[N]; ll find(ll x) {return (fa[x]==x)?x:(fa[x]=find(fa[x]));} void Merge(ll x,ll y){ x=find(x);y=find(y); ans-=siz[x]*siz[x]+siz[y]*siz[y]; fa[y]=x;siz[x]+=siz[y]; ans+=siz[x]*siz[x]; return; } ll Ask(ll l,ll r){ if(l>L)return 0; if(r>L)r=L; ll z=lg[r-l+1]; ll x=f[l][z],y=f[r-(1<<z)+1][z]; if(w[x]*co[y]>w[y]*co[x])return x; return y; } signed main() { scanf("%lld%lld",&n,&T); for(ll i=1;i<=n;i++){ ll x;scanf("%lld",&x); v[x].push_back(i); fa[i]=i;siz[i]=co[i]=1; } ll cnt=0; for(ll i=1;i<=1e6;i++){ for(ll j=0;j<v[i].size();j++){ ll x=v[i][j];k[x]=1;ans++;cnt++; if(k[x-1])Merge(x-1,x),cnt--; if(k[x+1])Merge(x,x+1),cnt--; } if(w[cnt]*i<=ans*co[cnt])w[cnt]=ans,co[cnt]=i; L=max(L,cnt); } for(ll i=1;i<=L;i++)f[i][0]=i; for(ll i=2;i<=L;i++)lg[i]=lg[i>>1]+1; for(ll j=1;(1<<j)<=L;j++) for(ll i=1;i+(1<<j)-1<=L;i++){ ll x=f[i][j-1],y=f[i+(1<<j-1)][j-1]; if(w[x]*co[y]>w[y]*co[x])f[i][j]=x; else f[i][j]=y; } ans=0; while(T--){ ll a,b,x,y; scanf("%lld%lld%lld%lld",&a,&b,&x,&y); ll l=(a*ans+x-1)%n+1; ll r=(b*ans+y-1)%n+1; if(l>r)swap(l,r); ll p=Ask(l,r); if(!w[p])printf("-1 -1\n"); else printf("%lld %lld\n",w[p],co[p]); printf("%lld %lld %lld\n",l,r,ans); ans=w[p]?(w[p]*co[p]%n):1; } return 0; }

__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/14630841.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(103)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示