P5012-水の数列【并查集,RMQ】
正题
题目链接: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】的更多相关文章
- luogu5012 水の数列 (并查集+线段树)
如果我们能求出来每个区间个数的最大分值,那就可以用线段树维护这个东西 然后出答案了 然后这个的求法和(luogu4269)Snow Boots G非常类似,就是我们把数大小排个序,每次都拿<=x ...
- P5012 水の数列
P5012 水の数列 离线处理出选择每个数得到区间数得到刚开始的得分 \(RMQ_{ij}\)表示\(i\)~\(i\)+\(2^j\)-1的区间最大值 #include<cstdio> ...
- Jzoj 初中2249 蒸发学水(并查集)
题目描述 众所周知,TerryHu 是一位大佬,他平时最喜欢做的事就是蒸发学水. 机房的位置一共有n 行m 列,一开始每个位置都有一滴学水,TerryHu 决定在每一个时刻选择 一滴学水进行蒸发,直到 ...
- 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 ...
- NYOJ--42--dfs水过||并查集+欧拉通路--一笔画问题
dfs水过: /* Name: NYOJ--42--一笔画问题 Author: shen_渊 Date: 18/04/17 15:22 Description: 这个题用并查集做,更好.在练搜索,试试 ...
- Uva 10596 - Morning Walk 欧拉回路基础水题 并查集实现
题目给出图,要求判断不能一遍走完所有边,也就是无向图,题目分类是分欧拉回路,但其实只要判断度数就行了. 一开始以为只要判断度数就可以了,交了一发WA了.听别人说要先判断是否是联通图,于是用并查集并一起 ...
- 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 ...
- HDU1856More is better(并查集)
最近发现以前的东西都忘得差不多了,在这里刷刷水题 并查集: int find_parent(int x) { return x = p[x] ? x : p[x] = find_parent(p[x] ...
- RQNOJ PID379 / 约会计划 -并查集
PID379 / 约会计划 题目描述 cc是个超级帅哥,口才又好,rp极高(这句话似乎降rp),又非常的幽默,所以很多mm都跟他关系不错.然而,最关键的是,cc能够很好的调解各各妹妹间的关系.mm之间 ...
随机推荐
- SpringCache(redis)
pom <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spr ...
- 【springcloud】Zuul 超时、重试、并发参数设置
转自:https://blog.csdn.net/xx326664162/article/details/83625104 一. Zuul 服务网关 服务网关 = 路由转发 + 过滤器 1.路由转发: ...
- JDBC基础篇(MYSQL)——使用statement执行DML语句(insert/update/delete)
注意:其中的JdbcUtil是我自定义的连接工具类:代码例子链接: package day02_statement; import java.sql.Connection; import java.s ...
- 用Java8把List转为Map
1 import com.yang.test.User; 2 3 import javax.jws.soap.SOAPBinding; 4 import java.util.*; 5 import j ...
- 前端调用后台接口下载word文档的两种方法
1传统的ajax虽然能提交到后台,但是返回的数据被解析成json,html,text等字符串,无法响应浏览器下载.就算使用bob模拟下载,数据量大时也不方便 废话不多说:上代码(此处是Layui监听提 ...
- linux shell 删除满足正则表达式的文件
用find配合xargs rm find . -type f -name "to_delete_file_[a-z]_*_[0-9].jpg" | xargs rm
- ReScript 与 TypeScript,谁是前端圈的“当红辣子鸡”
摘要: ReScript 和 TypeScript 的出现都是为了更好地使用JavaScript,但两者还是有很大的不同. 本文分享自华为云社区<[云创共驻]ReScript 和 TypeScr ...
- try/catch捕获处理异常
1.throws是中断处理,后续代码不能执行 try/catch方法体之后的后续代码有没有异常都可以继续执行: 2.当try方法体中出现异常才会执行catch方法体中代码
- Lambda表达式——注重过程的编程思想
一.使用匿名内部类的匿名对象创建线程和Lambda表达式写法 Lambda表达式写法不用去定义一个Runable接口的实现类: 二.方法入参是一个接口或者接口的实现类 三.对某个类的一些对象实例进行排 ...
- Swagger-初见
目录 Swagger简介 SpringBoot集成Swagger 配置Swagger 配置扫描接口 配置Swagger开关 配置API分组 实体配置 常用注解 Swagger简介 前后端分离 前端 - ...