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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

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

發(fā)布時(shí)間:2023/12/3 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P5012-水の数列【并查集,RMQ】 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

正題

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


題目大意

nnn個(gè)數(shù)字的一個(gè)序列,TTT次詢問(wèn)給出[l,r][l,r][l,r]要求

  • 找出一個(gè)最大的xxx滿足。提出所有的小于xxx的數(shù),然后被提出的數(shù)的連續(xù)區(qū)間長(zhǎng)度平方和除以xxx的值最大
  • 要求分出來(lái)的區(qū)間個(gè)數(shù)在[l,r][l,r][l,r]之間
  • 強(qiáng)制在線

1≤n≤106,1≤T≤103,1≤ai≤1061\leq n\leq 10^6,1\leq T\leq 10^3,1\leq a_i\leq 10^61n106,1T103,1ai?106


解題思路

考慮到xxx的取值不會(huì)超過(guò)[1,106][1,10^6][1,106],所以暴力枚舉xxx,然后用并查集合并區(qū)間計(jì)算出每個(gè)xxx的區(qū)間個(gè)數(shù)和長(zhǎng)度平方和。

然后丟到對(duì)應(yīng)位置跑RMQRMQRMQ就好了。

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


code

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

總結(jié)

以上是生活随笔為你收集整理的P5012-水の数列【并查集,RMQ】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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