正题

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


题目大意

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

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

\(1\leq n\leq 10^6,1\leq T\leq 10^3,1\leq a_i\leq 10^6\)


解题思路

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

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

时间复杂度\(O(n\log n+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;
}

P5012-水の数列【并查集,RMQ】的更多相关文章

  1. luogu5012 水の数列 (并查集+线段树)

    如果我们能求出来每个区间个数的最大分值,那就可以用线段树维护这个东西 然后出答案了 然后这个的求法和(luogu4269)Snow Boots G非常类似,就是我们把数大小排个序,每次都拿<=x ...

  2. P5012 水の数列

    P5012 水の数列 离线处理出选择每个数得到区间数得到刚开始的得分 \(RMQ_{ij}\)表示\(i\)~\(i\)+\(2^j\)-1的区间最大值 #include<cstdio> ...

  3. Jzoj 初中2249 蒸发学水(并查集)

    题目描述 众所周知,TerryHu 是一位大佬,他平时最喜欢做的事就是蒸发学水. 机房的位置一共有n 行m 列,一开始每个位置都有一滴学水,TerryHu 决定在每一个时刻选择 一滴学水进行蒸发,直到 ...

  4. Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) A B C D 水 模拟 并查集 优先队列

    A. Broken Clock time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  5. NYOJ--42--dfs水过||并查集+欧拉通路--一笔画问题

    dfs水过: /* Name: NYOJ--42--一笔画问题 Author: shen_渊 Date: 18/04/17 15:22 Description: 这个题用并查集做,更好.在练搜索,试试 ...

  6. Uva 10596 - Morning Walk 欧拉回路基础水题 并查集实现

    题目给出图,要求判断不能一遍走完所有边,也就是无向图,题目分类是分欧拉回路,但其实只要判断度数就行了. 一开始以为只要判断度数就可以了,交了一发WA了.听别人说要先判断是否是联通图,于是用并查集并一起 ...

  7. Codeforces Round #376 (Div. 2) A B C 水 模拟 并查集

    A. Night at the Museum time limit per test 1 second memory limit per test 256 megabytes input standa ...

  8. HDU1856More is better(并查集)

    最近发现以前的东西都忘得差不多了,在这里刷刷水题 并查集: int find_parent(int x) { return x = p[x] ? x : p[x] = find_parent(p[x] ...

  9. RQNOJ PID379 / 约会计划 -并查集

    PID379 / 约会计划 题目描述 cc是个超级帅哥,口才又好,rp极高(这句话似乎降rp),又非常的幽默,所以很多mm都跟他关系不错.然而,最关键的是,cc能够很好的调解各各妹妹间的关系.mm之间 ...

随机推荐

  1. cad转换成png,svg

    1.设置仓库可以在setting.xml中设置(也可以在pom中设置,设置项即可) <mirror> <id>AsposeJavaAPI</id> <name ...

  2. Saruman's Army

    直线上有N个点. 点i的位置是Xi.从这N个点中选择若干个,给它们加上标记. 对每一个点,其距离为R以内的区域里必须有带有标记的点(自己本身带有标记的点, 可以认为与其距离为 0 的地方有一个带有标记 ...

  3. Windows搭建mac黑苹果系统

    最近看到一个开源工具tidevice,是可以脱离mac来做ios自动化测试的.看到这么方便,就想着来尝尝鲜.但由于使用该工具,是需要基于WebDriverAgent的,该工具又需要使用Xcode重签名 ...

  4. Visual Studio 2022 预览版3 最新功能解说

    我们很高兴地宣布Visual Studio 2022 的第三个预览版问世啦!预览版3 提供了更多关于个人和团队生产力.现代开发和持续创新等主题的新功能.在本文中,我们将重点介绍Visual Studi ...

  5. 战胜了所有对手,却输给了时代。MVVM--jQuery永远的痛。

    前言 第二次浏览器战争中,随着以 Firefox 和 Opera 为首的 W3C 阵营与 IE 对抗程度的加剧,浏览器碎片化问题越来越严重,不同的浏览器执行不同的标准,对于开发人员来说这是一个恶梦.为 ...

  6. linux安装mysql80

    打开网址:https://dev.mysql.com/downloads/repo/yum/,选择对应li 安装mysql源 yum -y localinstall mysql80-community ...

  7. IMO 1977 第 2 题探析

    原题:在一个有限的实数数列中,任意 7 个连续项之和为负数,且任意 11 个连续项之和为正数.求这个数列最多有多少项. 解法一:记这个数列为 a1, a2, ..., ak,问题等价于求 k 的最大值 ...

  8. SpringMVC笔记(2)

    一.SpringMVC的数据响应 1.1 数据响应方式 1.1.1 页面跳转 直接返回字符串 将返回的字符串与内部资源视图解析器的前后缀拼接 进行访问(默认为转发) 通过ModelAndView对象返 ...

  9. openresty 自动 deploy github repository

    配置 deploy key 配置 webhooks https://gist.github.com/hangj/ce6aabac77e96b010e3b361e18422013

  10. 二、grep文本搜索工具

    grep命令作为Unix中用于文本搜索的神奇工具,能够接受正则表达式,生成各种格式的输出.除此外,它还有大量有趣的选项. # 搜索包含特定模式的文本行: [root@centos8 ~]#grep p ...