「Destiny」Solution

2024-05-01 02:44
文章标签 solution destiny

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

简述题意

给定 n n n 个元素, q q q 次询问。
每次给出三个参数 l , r , k l, r, k l,r,k,询问区间 [ l , r ] [l, r] [l,r] 内是否存在出现次数严格大于 r − l + 1 k \frac{r - l + 1} {k} krl+1 的数。如果有,输出最小的那个数,否则输出 − 1 -1 1

  • 1 ≤ n , q ≤ 3 × 1 0 5 1\leq n, q\leq 3\times 10 ^ 5 1n,q3×105 1 ≤ a i ≤ n 1\leq a_i\leq n 1ain 2 ≤ k ≤ 5 2\leq k\leq 5 2k5

思路

注意到,出现次数随着区间长度增大而增大。也就意味着,对于长度很大的区间,可能满足条件的数不会有太多个,这启发我们根号分治。

不妨令 l e n = r − l + 1 len=r-l+1 len=rl+1,表示区间长度。

  • l e n ≤ n len \le \sqrt n lenn ,直接暴力枚举区间,统计区间内每个数出现的次数即可。
  • l e n > n len > \sqrt n len>n ,由于 k k k 最大为 5 5 5,所以这个数在 [ l , r ] [l,r] [l,r] 中至少出现 n 5 \dfrac{\sqrt n}{5} 5n 次,也就意味着其在整个序列中也需要至少出现 n 5 \dfrac{\sqrt n}{5} 5n 次,而这样的数最多不超过 5 × n 5 \times \sqrt n 5×n ,直接暴力枚举判断即可。

时间复杂度大致为 O ( n × q + 5 × n × q ) O(\sqrt n \times q + 5 \times \sqrt n \times q) O(n ×q+5×n ×q)

然而,显而易见:如果直接取 n \sqrt n n ,前缀数组肯定是开不下的,经过多次测试(一顿乱试 ),根号分治的临界值取 3500 3500 3500 可以卡过去,因为此时只需要考虑出现次数大于 3500 5 \dfrac{3500}{5} 53500 的数,最多不会超过 n 700 \dfrac{n}{700} 700n 个(大概是 429 429 429 个)。

代码

相当于 —— 优雅的暴力。
注意加上读优写优。

#include <bits/stdc++.h>
#define siz 3500
using namespace std;
const int MAXN = 3e5 + 5;
int n , q , a[MAXN] , cnt[MAXN] , idx , rk[MAXN] , pre[MAXN][429];
vector<int> vt;
namespace IO{#define il inline#define Re registerchar B[1 << 15], *S = B, *T = B , obuf[1 << 15] , *p3 = obuf;#define getchar() (S == T && (T = (S = B) + fread(B, 1, 1 << 15, stdin), S == T) ? EOF : *S++)#define putchar(x) (p3-obuf<1 << 15)?(*p3++=x):(fwrite(obuf,p3-obuf,1,stdout),p3=obuf,*p3++=x)template<typename item>il void read(Re item &x) {char c(getchar());x = 0;int f(1);while (c < '0' || c > '9') {if (c == '-') f = -1;c = getchar();}while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) + (c ^ 48), c = getchar();x *= f;}il void readch(Re char &x) {x = getchar();while(x != 'L' && x != 'R') x = getchar();}template<typename item, typename ...Arg>il void read(item &tmp, Arg& ...tmps) {read(tmp);read(tmps...);}template<typename item>il void write(Re item x) {if (x < 0) {putchar('-') , x = -x;}if (x > 9) write(x / 10);putchar(x % 10 + '0');}
}
using namespace IO;
signed main() {ios::sync_with_stdio(false);cin.tie(nullptr) , cout.tie(nullptr);read(n , q);for (int i = 1 ; i <= n ; i ++) {read(a[i]);cnt[a[i]] ++;}for (int i = 1 ; i <= n ; i ++) {if (cnt[i] >= 700) rk[i] = ++ idx , vt.push_back(i);}for (int i = 1 ; i <= n ; i ++) {for (int j = 1 ; j <= idx ; j ++) pre[i][j] = pre[i - 1][j];if (rk[a[i]]) pre[i][rk[a[i]]] ++;}while(q --) {int l , r , k , d;read(l , r , k);if ((r - l + 1) % k == 0) d = (r - l + 1) / k + 1;else d = (r - l + 1 + (k - 1)) / k;if(r - l + 1 <= siz) {for (int i = l ; i <= r ; i = -~i) cnt[a[i]] = 0;int ans = 1e9;for (int i = l ; i <= r ; i = -~i) {cnt[a[i]] ++;if (cnt[a[i]] >= d) ans = min(ans , a[i]);}write(ans == 1e9 ? -1 : ans) , putchar('\n');} else {int ans = -1;for (int v : vt) {int id = rk[v];if (pre[r][id] - pre[l - 1][id] >= d) {ans = v;break;}}write(ans) , putchar('\n');}}fwrite(obuf , p3 - obuf , 1 , stdout);return 0;
}

这篇关于「Destiny」Solution的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

AtCoder Beginner Contest 370 Solution

A void solve() {int a, b;qr(a, b);if(a + b != 1) cout << "Invalid\n";else Yes(a);} B 模拟 void solve() {qr(n);int x = 1;FOR(i, n) FOR(j, i) qr(a[i][j]);FOR(i, n) x = x >= i ? a[x][i]: a[i][x];pr2(

error on “nvm list available“, find the final solution by the Second error

error one Could not retrieve https://nodejs.org/dist/index.json. Get “https://nodejs.org/dist/index.json”: dial tcp 104.20.23.46:443: i/o timeout error two Error retrieving “http://npm.taobao.org/m

Destiny of Gods首轮测试正式开启,参与玩家数量突破10万

天神风云,波澜再兴,GameFi链游聚合平台Destiny of Gods首款同名数字卡牌回合制游戏首轮测试定档8月20日20:00(GMT+8),现已正式开启! 这是一个由人、游灵和神灵共存的世界,历经蛮荒时期的纷争与信仰时期的和平,天神界再次陷入混乱,所有生灵都在期待你可以率领愿意追随你的天神,继续巡游和天神们最初始的工作,还天神大陆一片安宁。Destiny of Gods将以“边玩边赚”的

Deep in MTK Turnkey Solution Logging Tools

一个完整的日志系统除了Log保存机制以外,还要有Log查看机制。不管是Kernel Log还是Android Log都会将Log打印到buffer,那么Log工具则会将Buffer里面的Log拿出来做相应的处理,或者打印到终端,或者对Log做解析以及过滤等等。而Kernel Log除了打印到buffer以外还会打印到Console,那么从console获取Log也是一种常见的方式。 那到底都

Python typeError: a bytes-like object is required, not ‘str’ Solution

目录 一、需求 二、报错 三、解决方法 一、需求 调接口解析其中 dis 字段。 二、报错 Python Typeerror a bytes-like object is required not ‘str’ 这句话的意思是“类型错误:需要类似字节的对象,而不是字符串”。 三、解决方法 在需要解析的字段前 加上 b 原代码: if 'dis' in response

Error occurred in deployment step 'Retract Solution': Invalid object name 'AllWebs'

Check the error message on Monitoring-->Review Project and solutions, and try running SharePoint 2010 Products Configuration Wizard.

「Pudding Monsters」Solution

简述题意 给定一个 n × n n \times n n×n 的棋盘,其中有 n n n 个棋子,每行每列恰好有一个棋子。 对于所有的 1 ≤ k ≤ n 1 \leq k \leq n 1≤k≤n,求有多少个 k × k k \times k k×k 的子棋盘中恰好有 k k k 个棋子,输出其总和。 n ≤ 3 × 1 0 5 n \le 3 \times 10^5 n≤3×

XML Problem Design Solution

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出版、作者信息和本声明。否则将追究法律责任。 http://blog.csdn.net/topmvp - topmvp *Offering a unique approach to learning XML, this book walks readers through the process of building a co

netty-time-Second Solution

TimeServer、TimeServerHandler同上篇文章。 package org.q.netty.time2;import java.net.InetSocketAddress;import java.util.concurrent.Executors;import org.jboss.netty.bootstrap.ClientBootstrap;import org.jb

「Positions in Permutations」Solution

简述题意 给定 n , m n,m n,m,对于一个长度为 n n n 的排列 p p p,有函数: F ( p ) = ∑ i = 1 n [ ∣ p i − i ∣ = 1 ] F(p)=\sum_{i=1}^{n}[\left|p_i-i\right|=1 ] F(p)=i=1∑n​[∣pi​−i∣=1]求有多少个排列满足 F ( p ) = m F(p) = m F(p)=m,答