Loj 6285. 数列分块入门 9

链接:

https://loj.ac/problem/6285

 

思路:

离散化处理下就好了,具体解释在代码里、

 

ps:

小新新别看了,你学不会的

 

实现代码:

复制代码
#include<bits/stdc++.h>
using namespace std;
const int M = 1e5 + 10;
int n,block,idx,a[M],bl[M],f[510][510],val[M],cnt[M];
vector<int>ve[M];
void pre(int x){  //预处理
    memset(cnt,0,sizeof(cnt));
    int mx = 0, ans = 0;
    for(int i = (x - 1)*block+1;i <= n;i ++){
        cnt[a[i]]++;
        int t = bl[i];
        if(cnt[a[i]] > mx||(cnt[a[i]]==mx&&val[a[i]]<val[ans])) //如果在当前区间出现次数比最大值或者和最大值一样但是值比最大值小,那么更新最大值
            ans = a[i],mx = cnt[a[i]];
        f[x][t] = ans;  //代表 x块 到 t块中的最小众数
    }
}

int query(int l,int r,int x){  //在ve[ai]二分寻找在l,r区间的a[i]的数量
    int t = upper_bound(ve[x].begin(),ve[x].end(),r) - lower_bound(ve[x].begin(),ve[x].end(),l);
    return t;
}

int query(int l,int r){
    int ans,mx;
    ans = f[bl[l]+1][bl[r]-1]; //完整块的查询
    mx = query(l,r,ans);
    //非完整块的查询
    for(int i = l;i <= min(bl[l]*block,r);i ++){
        int t = query(l,r,a[i]);
        if(t > mx||(t == mx&&val[a[i]] < val[ans]))
            ans = a[i],mx = t;
    }
    if(bl[l] != bl[r]){
        for(int i = (bl[r]-1)*block+1;i <= r;i ++){
            int t = query(l,r,a[i]);
            if(t > mx||(t == mx&&val[a[i]] < val[ans]))
                ans = a[i],mx = t;
        }
    }
    return ans;
}
map<int,int>mp;
int main()
{
    int l,r;
    scanf("%d",&n);
    block = sqrt(n);
    for(int i = 1;i <= n;i ++){
        scanf("%d",&a[i]);
        if(!mp[a[i]]){
            mp[a[i]] = ++idx;   //离散化
            val[idx] = a[i];    //val数组储存离散化之前的值
        }
        a[i] = mp[a[i]]; //离散化
        ve[a[i]].push_back(i);  //将每个a[i]出现的下标存到a[i]对应的vecotr里
    }
    for(int i = 1;i <= n;i ++) bl[i] = (i - 1)/block + 1;
    for(int i = 1;i <= bl[n];i ++)  pre(i); //预处理每一个块
    for(int i = 1;i <= n;i ++) {
        scanf("%d%d",&l,&r);
        if(l > r) swap(l,r);
        printf("%d\n",val[query(l,r)]);
    }
    return 0;
}
复制代码

 

posted @   冥想选手  阅读(178)  评论(0编辑  收藏  举报
编辑推荐:
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· 程序员常用高效实用工具推荐,办公效率提升利器!
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)
点击右上角即可分享
微信分享提示