正题

题目链接: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;
}

最新文章

  1. AngularJS +HTML Demo
  2. 使用django开发博客过程记录5——日期归档和视图重写
  3. 修改 phpmyadmin 创建数据库默认编码
  4. 在Grunt task中集成Protractor
  5. linux iftop流量查看工具的安装与使用
  6. Java Config 下的Spring Test方式
  7. 看linux连接进程占用的实时流量iftop netatop NetHogs
  8. json包的loads dumps区分
  9. ReactEurope Conf 参会感想
  10. boost库在工作(37)网络UDP服务端之七
  11. HDU2699+Easy
  12. [Mugeda HTML5技术教程之12]制作跨屏互动应用
  13. 单服务器防护linux iptables脚本
  14. java中a=a+1和a+=1的区别
  15. Linux下修改Swap分区大小
  16. Web前端 web的学习之路2
  17. windows环境中JDK环境变量配置
  18. 19.3.20 解决pycharm快捷键无法使用问题和熟悉git与码云操作流程
  19. DispatcherServlet源码分析
  20. activemq消息队列的使用及应用docker部署常见问题及注意事项

热门文章

  1. Spring-Boot-Bean的使用,@Repository,@Service,@Controller,@Component
  2. ASP.NET Core:中间件
  3. 编写一个简单的COM组件
  4. npm : 无法加载文件 C:\Program Files\nodejs\node_global\npm.ps1,因为在此系统上禁止运行脚本。
  5. wpf 中的DataTemplate 绑定控件
  6. 【java虚拟机】jvm调优原则
  7. C#&#183;好文分享
  8. php实现验证码(数字、字母、汉字)
  9. (一)Superset 1.3图表篇——Table
  10. k8s 存活探针(健康检查)