首页 > 其他分享 >P7811 [JRKSJ R2] 你的名字。

P7811 [JRKSJ R2] 你的名字。

时间:2023-12-22 11:46:32浏览次数:33  
标签:le R2 int text sqrt re JRKSJ P7811 define

\(\text{Links}\)

P7811 [JRKSJ R2] 你的名字。

LuoguBlog


题外话

  • 纪念一下 300 蓝紫

  • 最开始看到这题的时候没做出来,今天突然就会了,看来写大分块还是有点用的

  • 第一次写分块套 ST(虽然不是第一次有这个想法,但以前只口胡过),还是写一下

  • ARF 我的神(乱入


题意

求区间 \([l,r]\) 内 \(a_i\) 在模 \(k\) 意义下的最小值。

\(1\le n,m\le 3\times 10^5,1\le V\le 10^5\)(\(V\) 为值域)

\(\text{1s,128MB}\)


题解

取模,根号分治,设定阈值 \(T\)。下面认为 \(n,m\) 同阶。

当 \(k\le T\) 时,直接做 \(T\) 次暴力取模,然后问题就变成了 \(\text{RMQ}\),此处 \(\text{RMQ}\) 选择了用分块实现。时间复杂度 \(O(nT+n\sqrt n)\)。

当 \(k\gt T\) 时,我们可以暴力跳 \(k\) 的倍数(设为 \(x\)),每个 \(k\) 只会跳 \(O(\frac{V}{T})\) 次,总共 \(O(\frac{nV}{T})\) 次,然后此时的答案应是 \(min\{a_i|l\le i\le r \land a_i\ge x\}-x\),即 \(O(\frac{nV}{T})\) 次查询区间内 \(x\) 的非严格后继。

感觉这个查询次数大概只能支持 \(O(1)\) 查询,但是求区间内非严格后继这个东西看起来不太好实现 \(O(1)\),考虑转化一下。

我们把这些询问离线下来,将 \(a_i\) 从大到小插入,同时从大到小地去 \(\text{solve}\) \(x\),这样问题就变成了 \(O(n)\) 次修改,\(O(\frac{nV}{T})\) 查询区间最小值,就好做得多了。

线段树、树状数组啥的都不能 \(O(1)\) 查询,分块才有前途。但是 \(\min\) 是不可差分信息,我们不能像分块维护可差分信息那样维护块内前后缀信息和块间的前缀信息来做到 \(O(1)\) 查询。但是维护块内前后缀信息还是可以保留的,块间要做到 \(O(1)\) 查询,我们想到了 \(\text{ST}\)。用 \(\text{ST}\) 维护整块的信息可以做到 \(O(\sqrt n)\) 修改,\(O(1)\) 查询,很符合我们的需求。

但是 \(\text{128MB}\) 的空间不允许我们把全部的 \(O(\frac{nV}{T})\) 个 \(x\) 保存下来,考虑按 \(k\) 把它们整合一下。前面我们是枚举 \(k\) 的倍数 \(x\),这里我们反过来,当把 \(a_i\) 插入的过程进行到 \(x\) 的时候,枚举 \(x\) 的因数 \(k\),然后计算答案就好。

此部分时间复杂度为 \(O(n\sqrt n+\frac{nV}{T})\)。

取 \(T=\sqrt V\) 以达到平衡,总时间复杂度为 \(O(n(\sqrt n+\sqrt V))\),空间线性。


\(\texttt{Code}\)

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define il inline
#define re register
const int N=3e5+5,V=1e5,sq=1e3,len=550,T=500,star=1e9;
int n,m,id[N],L[sq],R[sq],st[10][sq];
int a[N],ans[N],b[N],mn[sq],pre[N],suf[N];
#define Log(x) (31^__builtin_clz(x))
#define pb emplace_back
bitset<V+10>s1,s2;
bitset<N>vis;
il int read(){
    re int x=0;re char c=getchar(),f=0;
    while(c<'0'||c>'9') f|=(c=='-'),c=getchar();
    while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c&15),c=getchar();
    return f?-x:x;
}
#define tii tuple<int,int,int>
#define mkt make_tuple
vector<tii>q1[V+5],q2[V+5];
vector<int>d[V+10],v[V+10];
il int GetMin_B(int l,int r){
    re int res=star;
    if(id[l]==id[r]){
        for(re int i=l;i<=r;i++)res=min(res,b[i]);
        return res;
    }
    for(re int i=l;i<=R[id[l]];i++)res=min(res,b[i]);
    for(re int i=L[id[r]];i<=r;i++)res=min(res,b[i]);
    for(re int i=id[l]+1;i<id[r];i++)res=min(res,mn[i]);
    return res;
}
il void Solve1(){
    for(re int k=s1._Find_first();k<=V;k=s1._Find_next(k)){
        memset(mn,0x3f,sizeof mn);
        for(re int i=1;i<=n;i++)b[i]=a[i]%k,mn[id[i]]=min(mn[id[i]],b[i]);
        for(tii i:q1[k])ans[get<2>(i)]=GetMin_B(get<0>(i),get<1>(i));
    }
}
il void Get_d(){
    for(re int i=s2._Find_first();i<=V;i=s2._Find_next(i))
        for(re int j=0;j<=V;j+=i)d[j].pb(i);
}
il void update(int x){
    for(re int i=L[id[x]];i<=x;i++)suf[i]=min(suf[i],a[x]);
    for(re int i=R[id[x]];i>=x;i--)pre[i]=min(pre[i],a[x]);
    for(re int i=0;i<=Log(id[n]);i++)
        for(re int j=max(id[x]-(1<<i)+1,1);j<=min(id[x],id[n]-(1<<i)+1);j++)
            st[i][j]=min(st[i][j],a[x]);
}
il int GetMin_ST(int l,int r){
    re int len=Log(r-l+1);
    return min(st[len][l],st[len][r-(1<<len)+1]);
}
il int GetMin(int l,int r){
    if(id[r]<=id[l]+1){
        re int res=star;
        for(re int i=l;i<=r;i++)if(vis.test(i))res=min(res,a[i]);
        return res;
    }
    return min(min(pre[r],suf[l]),GetMin_ST(id[l]+1,id[r]-1));
}
il void Solve2(){
    memset(st,0x3f,sizeof st);
    memset(pre,0x3f,sizeof pre);
    memset(suf,0x3f,sizeof suf);
    Get_d();
    for(re int p=V;p>=0;p--){
        for(int i:v[p])update(i),vis.set(i);
        for(int x:d[p])
            for(tii i:q2[x])
                ans[get<2>(i)]=min(ans[get<2>(i)],GetMin(get<0>(i),get<1>(i))-p);
                
    }
}
int main(){
    // freopen("my.in","r",stdin);
    // freopen("my.out","w",stdout);
    n=read(),m=read();
    for(re int i=1;i<=n;i++)a[i]=read(),id[i]=(i-1)/len+1,v[a[i]].pb(i);
    for(re int i=1;i<=id[n];i++)L[i]=R[i-1]+1,R[i]=i*len;
    R[id[n]]=n;
    for(re int i=1;i<=m;i++){
        re int l=read(),r=read(),k=read();
        if(k<=T)q1[k].pb(mkt(l,r,i)),s1.set(k);
        else q2[k].pb(mkt(l,r,i)),s2.set(k),ans[i]=star;
    }
    Solve1(),Solve2();
    for(re int i=1;i<=m;i++)cout<<ans[i]<<'\n';
    return 0;
}

标签:le,R2,int,text,sqrt,re,JRKSJ,P7811,define
From: https://www.cnblogs.com/MrcFrst-LRY/p/17921281.html

相关文章

  • harbor1.1.2无损升级到最新版本harbor2.5.0
    目标将老版本的harbor1.1.2无损升级到最新版本harbor2.5.0,后面有条件可以随版本更新基础环境信息hostIP:192.168.56.35httpdocker-compose路径:/usr/src/harbordata路径:/data升级步骤下面是升级版本需要的安装包,同样也意味着版本升级步骤harbor-offline-installer......
  • 打工笔记--------------------winform程序报错CLR20r3签名System.I0.IOException
    先看问题编写了一个程序在我本机运行没有问题,放到别人电脑上就有可能报这种错误System.I0.IOException  首先我问了一下ChatPgt:他说:CLR20r3是一个通用的错误代码,表示在.NETFramework中发生了未处理的异常。System.IO.IOException是与输入/输出操作相关的一个常见......
  • class sun.reflect.GeneratedConstructorAccessor2 cannot access its superclass sun
    在启动JFinal程序时报错classsun.reflect.GeneratedConstructorAccessor2cannotaccessitssuperclasssun.reflect.Constructor问题所在因为这个项目的原作者是使用eclipse编写的,idea和eclipse的启动机制不一样,由于eclipse并没有自动实现热加载机制,因此这里我们需要加上......
  • DOCKER20231217: 容器引擎Docker
       1.1Docker简介 1.1.1什么是Docker?一种轻量级的操作系统虚拟化技术,基于Go语言实现的开源容器项目,诞生于2013年,最初发起者是dotCloud公司(现DockerInc)Docker容器化虚拟技术vs传统虚拟机技术特性容器虚拟机启动秒级分钟级硬盘使用一般为MB一般为G......
  • Windows2008R2 IIS配置证书 ERR_SSL_VERSION_OR_CIPHER_MISMATCH 错误解决方法
    IISCrypto 用这个工具很方便,也可以手动修改注册表工具内置最佳实践,点击 BestPractices再Apply,然后重启服务器即可,设置前记得备份注册表。参考:https://blog.csdn.net/a873744779/article/details/103635882https://blog.csdn.net/jackbon8/article/details/82702563 ......
  • 【uiautomator2 】app最重要的操作:点击、滑动、输入、按键、截屏操作
    app的操作:点击、滑动、输入、按键操作https://blog.csdn.net/Moonlight_16/article/details/125258638app主要包括4大操作:点击click滑动swipe输入按键一、app点击操作click先进行元素定位,找到元素后再去执行click操作;d(text='').click()1通过全局坐标点击,元素不......
  • Angular Renderer2 的作用和使用场景介绍
    下图将cssclasscx-icon添加到hostdom上。最后效果如下:使用的renderer来自:import{Component,ElementRef,HostBinding,Input,Renderer2,}from'@angular/core';Angular的Renderer2是Angular框架中用于操作DOM元素的重要工具之一。Renderer2的主要作用是提......
  • windowserver2012服务器部署.net core3.1环境
    一、安装.netcore3.1要先具备这些系统补丁,如果没有则需要安装,这些KB必须按以下顺序安装:(clearcompressionflag.exe、KB2919442、KB2919355、KB2932046、KB2959977、KB2937592、KB2938439、KB2934018)安装过程中需要多次重启生效。最后安装vc_redist.x64.exe)二、.netcore3.......
  • 一文浅入Springboot+mybatis-plus+actuator+Prometheus+Grafana+Swagger2.9.2开发运维
    Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化RESTFUL风格的Web服务,是非常流行的API表达工具。Swagger能够自动生成完善的RESTFULAP文档,,同时并根据后台代码的修改同步更新,同时提供完整的测试页面来调试API。Prometheus是一个开源的服务监控系统和时序数据库......
  • 手摸手入门Springboot2.7集成Swagger2.9.2
    环境介绍技术栈springboot+mybatis-plus+mysql+oracle+Swagger软件版本mysql8IDEAIntelliJIDEA2022.2.1JDK1.8SpringBoot2.7.13mybatis-plus3.5.3.2REST软件架构风格REST即表述性状态传递(英文:RepresentationalStateTransfer,简称REST,中文:表示层状态转移)是RoyFielding博士在20......