正题

题目链接: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. Azkaban入门(启动一个Simple Example)

    Azkaban简介 azkaban是一个开源的任务调度系统 Azkaban是一套简单的任务调度服务,整体包括三部分webserver.dbserver.executorserver. 开发语言为Jav ...

  2. TypeScript 入门指南 【大白话】

    前言 聊聊为何要学习TypeScript? 从开发角度来讲, TypeScript 作为强类型语言,对属性有类型约束.在日常开发中少了减少了不必要的因参数类型造成的BUG,当你在使用同事封装好的函数时 ...

  3. 菜鸟的springboot常用注解总结

    菜鸟的springboot常用注解总结 0.前言 可以毫不夸张地说,这篇文章介绍的 Spring/SpringBoot 常用注解基本已经涵盖你工作中遇到的大部分常用的场景.对于每一个注解我都说了具体用 ...

  4. C#设计模式---单例模式(Singleton Pattern)

    一.定义 从"单例"字面意思上理解为一个类只有一个实例.官方定义:确保一个类只有一个实例,并提供一个全局访问点. 二.实现 下面以实现一个日志记录类为例,描述单例模式. 1 usi ...

  5. 并发控制--context篇

    目录 1. 前言 2 Context 实现原理 2.1 接口定义 2.1 cancelCtx 2.1.1 Done()接口实现 2.1.2 Err()接口实现 2.1.3 cancel()接口实现 2 ...

  6. 你不知道的echarts,前端鲍哥带你研究!

    前言 相信不少前端小伙伴刚接触 e-charts 肯定有点陌生,但是echarts咱不清楚,charts我们应该很熟悉,没错,echarts 就是我们日常可见的图表,不同的是 echarts 是用代码 ...

  7. git所遇到的问题

    出现这种情况,或 ERROR: Repository not found. fatal: 无法读取远程仓库. 解决办法如下: 1.先输入$ git remote rm origin(删除关联的orig ...

  8. 三大操作系统对比使用之·Windows10

    时间:2018-10-29 记录:byzqy 本篇是一篇个人对Windows系统使用习惯.技巧和应用推荐的文档,在此记录.分享和后续查询备忘. 打开终端: Win+R,调出"运行" ...

  9. .Net中异步任务的取消和监控

    相关类型: CancellationTokenSource 主要用来创建或取消令牌 CancellationToken 监听令牌状态,注册令牌取消事件 OperationCanceledExcepti ...

  10. Zookeeper:进大厂不得不学的分布式协同利器!

    大家好,我是冰河~~ 最近,有很多小伙伴让我更新一些Zookeeper的文章,正好也趁着清明假期把之前自己工作过程当中总结的Zookeeper知识点梳理了一番,打算写一个[精通Zookeeper系列] ...