249. 蒲公英

2024-05-11 00:58
文章标签 蒲公英 249

本文主要是介绍249. 蒲公英,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:249. 蒲公英

算法分析

进阶指南上算法描述已经很清晰了。这里是用vector维护的每个数在序列中出现的下标。假设总共T块,预处理出每两个块之间的最小众数,需要时间O(nT)。m个查询小块内每个数的出现次数为O(mn/T*logn),总体时间复杂度为两者之和。

根据均值不等式,如果时间复杂度最低,应满足 n T = m n / T l o g n nT=mn/Tlogn nT=mn/Tlogn,求得 T = n l o g n T=\sqrt {nlogn} T=nlogn ,这里面n<=40000,用 b l o blo blo表示块的长度, b l o = n / T blo=n/T blo=n/T,求得 b l o blo blo约等于52。

因此: b l o = 52 blo = 52 blo=52

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <vector>
#define ll long long
#define inf 0x7fffffff 
using namespace std;
const int N = 40010;
int n, m, a[N], lsh[N], bl[N], num[N], ori[N];  // ori[]表示离散化后原来的数  
int f[1000][1000]; // 保存块与块之间的最小众数  
int blo = 52; // 根据均值不等式计算出来的块的大小  
vector<int> v[N];
int szread()
{int x = 0, f = 1; char c = getchar();while (c < '0' || c > '9') {if (c == '-') f = -1; c = getchar();}while (c >= '0' && c <= '9') {x = x * 10 + c - '0'; c = getchar();}return x * f; 
}
void cal(int t)  // 第t块  
{int val = 0, maxn = -1;memset(num, 0, sizeof(num));for (int i = (t - 1) * blo + 1; i <= n; ++i){++num[a[i]];if (num[a[i]] > maxn || (num[a[i]] == maxn && a[i] < val)){maxn = num[a[i]];val = a[i]; }		f[t][bl[i]] = val;  // 放到if外面  }
}
void pre()
{for (int i = 1; i <= n; ++i) v[a[i]].push_back(i);for (int i = 1; i <= bl[n]; ++i) cal(i); // 计算[i, bl[n]]块的f值  
}
int main()
{n = szread(); m = szread();for (int i = 1; i <= n; ++i) a[i] = lsh[i] = szread();// 离散化  sort(lsh + 1, lsh + n + 1);int cnt = unique(lsh + 1, lsh + n + 1) - lsh - 1;for (int i = 1; i <= n; ++i) {int t = a[i];a[i] = lower_bound(lsh + 1, lsh + cnt + 1, a[i]) - lsh;ori[a[i]] = t;  // }		// 预处理  for (int i = 1; i <= n; ++i) bl[i] = (i - 1) / blo + 1;pre(); // 处理询问  int x = 0;for (int i = 1; i <= m; ++i){int l = szread(), r =szread();l = ((l + x - 1) % n) + 1;r = ((r + x - 1) % n) + 1;if (l > r) swap(l, r);int val = f[bl[l]+1][bl[r]-1];  // 整块的众数,离散化后的  int maxn = upper_bound(v[val].begin(), v[val].end(), r) - lower_bound(v[val].begin(), v[val].end(), l);// 计算左边小块的每个数在[l,r]出现的次数 for (int j = l; j <= min(bl[l]*blo,n); ++j) {int tem = upper_bound(v[a[j]].begin(), v[a[j]].end(), r) - lower_bound(v[a[j]].begin(), v[a[j]].end(), l);if (tem > maxn || (tem == maxn && a[j] < val)){maxn = tem;val = a[j];}}// 计算右边的小块  if (bl[l] != bl[r]){for (int j = (bl[r]-1)*blo + 1; j <= r; ++j){int tem = upper_bound(v[a[j]].begin(), v[a[j]].end(), r) - lower_bound(v[a[j]].begin(), v[a[j]].end(), l);if (tem > maxn || (tem == maxn && a[j] < val)){maxn = tem;val = a[j];}}}//printf("%d\n", ori[val]);x = ori[val];} return 0;
}

反思与总结

  1. 在预处理 p r e pre pre函数中,计算f[][]要放在if外面,小细节,很容易忽略。

  2. 离散化后,最后求的结果,要将原始值输出,容易忘记。ori[val]代表离散化后值为val的原始值。

  3. 注意upper_bound()和lower_bound()的使用。

这篇关于249. 蒲公英的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/978059

相关文章

贝锐蒲公英远程视频监控方案:4G入网无需公网IP,跨品牌统一管理

在部署视频监控并实现集中监看时,常常会遇到各种挑战。比如:部分监控点位布线困难、无法接入有线宽带,或是没有固定公网IP,难以实现远程集中监看;已有网络质量差,传输延迟大、丢包率高,远程实时查看监控容易导致画面卡顿、丢帧,影响监看效果;一些监控区域已经有设备,不同品牌、不同设备之间缺乏统一标准和平台,无法快速实现远程统一管理、集中监看。 面对上述问题,如果替换现有网络,申请运营商专线不仅价格高

建模杂谈系列249 增量数据的正态分布拟合

说明 从分布开始,分布又要从正态开始 假设有一批数据,只有通过在线的方式增量获得。 内容 1 生成 先通过numpy生成一堆随机数据,从3个正态分布生成,然后拼接起来。 import numpy as npimport matplotlib.pyplot as pltfrom sklearn.mixture import GaussianMixture# 生成示例数据np.

让蒲公英飘动起来

晚上回到宿舍,突然想起,我可以把昨天晚上的代码修改一下,来让我的蒲公英达到飘动的效果,然后就把代码乱修改了一番,代码如下,但是飘动的效果得在运行的时候才能看出来,具体代码如下: import java.awt.BasicStroke;import java.awt.Color;import java.awt.Dimension;import java.awt.Graphics2D;imp

蒲公英 - 免费的应用托管平台|App应用众测分发

蒲公英 - 免费的应用托管平台|App应用众测分发 蒲公英 为开发者提供简洁迅速的内测程序分发服务... 将应用安装包一键上传到 蒲公英,内测用户即可用手机扫描二维码一键安装,通过 蒲公英管理功能,实现权限完美控制。 内测 ...

自动化打包上传至 fir.im 蒲公英 pre.im

http://www.jianshu.com/p/b2337700b9be http://www.jianshu.com/p/b2337700b9be http://www.jianshu.com/p/b2337700b9be 自动化打包上传至 fir.im 蒲公英 pre.im 字数439  阅读167  评论0  喜欢1 蒲公英平台请移步http:/

一步一步构建iOS持续集成:Jenkins+GitLab+蒲公英+FTP

http://www.jianshu.com/p/c69deb29720d http://www.jianshu.com/p/c69deb29720d 一步一步构建iOS持续集成:Jenkins+GitLab+蒲公英+FTP 字数2382  阅读27585  评论46  喜欢144 什么是持续集成 持续集成是一种软件开发实践,即团队开发成员经常集成它们的工

蒲公英jenkins 上传apk

https://www.pgyer.com/doc/api#uploadApp 接口说明 利用蒲公英提供的接口,第三方开发者可以把蒲公英提供的应用上传托管、安装等功能,接入到自己的应用中,并且可以根据数据接口,获取蒲公英提供的各种应用数据,以方便开发者更容易的进行内测应用的分发。 除特别说明,所有数据API的请求方式均为HTTP POST方式。获取图片等资源

贝锐蒲公英异地组网:降低建筑工地远程视频监控成本、简化运维

中联建设集团股份有限公司是一家建筑行业的施工单位,专注于建筑施工,业务涉及市政公用工程施工总承包、水利水电工程施工总承包、公路工程施工总承包、城市园林绿化专业承包等,在全国各地开展有多个建筑项目,并且项目时间周期可能长达数月。 由于存在公司总部需要查看项目工地现场监控,以及现场人员访问总部办公系统查阅工程文件等需求,因此需要联通总部网络与各个项目建筑施工地的网络。 早前,公司采用的解决方案

Codeforces Round #249 (Div. 2) A B

C好像就是个模拟,D 是个编码复杂度大的,但是好像也就是枚举三角形,我这会儿准备区域赛,尽量找点思维难度大的,所以昨晚A B 还是去做区域赛题吧..... B 也有点意思 贪心 题意:交换相邻两个位的数,然后最多换k次,求最大数 解法,找<=k范围内的最大数,与之交换,右移一位,继续找,直到k用完 //#pragma comment(linker, "/STACK:102400000,

蒲公英Ghost Win 7 Sp1(x86/x64)旗舰版 201910

蒲公英 Ghost Win 7 Sp1 ( x86/x64 )旗舰版  201910        蒲公英win7下载地址.rar  (12.99 KB, 下载次数: 2)  更多技术资讯可关注:itheimaGZ获取