[luogu3709][大爷的字符串题]
题意
一天做到两道这种题目描述如此神仙的题也是够了。真锻炼语文能力。
题目的意思其实就是,给你一个序列,然后每次询问一个区间。使得尽量按照严格上升的顺序从这个区间内取数。如果当前取得数字小于等于前面的其中一个,就让rp--,然后重新开始记录。问rp最多可以是多少。
思路
思考一下可以发现,其实就是求区间内众数出现的次数。
原因如下:
如果有相等的数字,那么这些数字是无法避免rp--的。既然无论如何都要减了,那么就要考虑如何让他减得更有价值。
比如说有一段序列:1 1 1 2 2 5 5 6 7 8
现在1 和 2都是有多个,显然按照下面的顺序取数是最优秀的:
1 2 5 6 7 8 1 2 5 1
这样减掉的rp其实就是众数1出现的次数。
所以这道题就是询问区间内众数出现的次数了。可以用莫队来实现。
用cnt[i]来表示i这个数字出现的次数(需要先离散化)。T[i]表示出现次数为i的数的个数。
在从一个区间向另一个区间转移时,方法很显然。具体见代码
代码
/*
* @Author: wxyww
* @Date: 2018-12-17 20:07:20
* @Last Modified time: 2018-12-17 20:40:37
*/
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<bitset>
#include<map>
using namespace std;
typedef long long ll;
const int N = 200000 + 10;
map<int,int>ma;
ll read() {
ll 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;
}
int a[N],cnt[N],ls[N],anss[N];
int ans,L,R,belong[N],T[N];
struct node {
int id,l,r;
}Q[N];
bool cmp(node x,node y) {
return belong[x.l] == belong[y.l] ? x.r < y.r : x.l < y.l;
}
void update(int pos,int c) {
T[cnt[a[pos]]]--;
if(T[cnt[a[pos]]] == 0 && ans == cnt[a[pos]]) {
while(T[ans] == 0 && ans) ans--;
}
cnt[a[pos]] += c;
T[cnt[a[pos]]]++;
if(cnt[a[pos]] > ans) ans = cnt[a[pos]];
}
int main() {
int n = read(),m = read();
int blsiz = sqrt(n);
for(int i = 1;i <= n;++i) ls[i] = a[i] = read(),belong[i] = (i - 1) / blsiz + 1;
int lsjs = 0;
sort(ls + 1,ls + n + 1);
ma[ls[1]] = ++lsjs;
for(int i = 2;i <= n;++i) if(ls[i] != ls[i - 1]) ma[ls[i]] = ++lsjs;
for(int i = 1;i <= n;++i) a[i] = ma[a[i]];
for(int i = 1;i <= m;++i)
Q[i].l = read(),Q[i].r = read(),Q[i].id = i;
sort(Q + 1,Q + n + 1,cmp);
for(int i = 1;i <= m;++i) {
while(L > Q[i].l) update(--L,1);
while(R < Q[i].r) update(++R,1);
while(L < Q[i].l) update(L++,-1);
while(R > Q[i].r) update(R--,-1);
anss[Q[i].id] = ans;
}
for(int i = 1;i <= m;++i) printf("%d\n",-anss[i]);
return 0;
}
一言
烟花易冷,人事易分。
[luogu3709][大爷的字符串题]的更多相关文章
- 题解【luogu3709 大爷的字符串题】
Description 个人觉得这是这道题最难的一步...出题人的语文... 每次给出一个区间,求这个区间最少能被多少个单调上升的序列覆盖. Solution 这个东西可以转化为这个区间中出现次数最多 ...
- P3709 大爷的字符串题 (莫队)
题目 P3709 大爷的字符串题 题意:求\([l,r]\)中众数的个数. 解析 维护两个数组: \(cnt[x]\),数\(x\)出现的次数. \(sum[x]\),出现次数为\(x\)的数的个数. ...
- AC日记——大爷的字符串题 洛谷 P3709
大爷的字符串题 思路: 莫队,需开O2,不开50: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 20000 ...
- P3709 大爷的字符串题(莫队+结论)
题目 P3709 大爷的字符串题 做法 有一个显然的结论:一段区间里最小答案为众数的个数 用莫队来离线求众数 \(tmp_i\)表示出现\(i\)次的数的个数,\(num_i\)表示\(i\)出现的次 ...
- luogu P3709 大爷的字符串题
二次联通门 : luogu P3709 大爷的字符串题 /* luogu P3709 大爷的字符串题 莫队 看了半天题目 + 题解 才弄懂了要求什么... 维护两个数组 一个记录数字i出现了几次 一个 ...
- 洛谷 P3709 大爷的字符串题
https://www.luogu.org/problem/show?pid=3709 题目背景 在那遥远的西南有一所学校 /*被和谐部分*/ 然后去参加该省省选虐场 然后某蒟蒻不会做,所以也出了一个 ...
- 洛谷P3709 大爷的字符串题(莫队)
题目背景 在那遥远的西南有一所学校 /*被和谐部分*/ 然后去参加该省省选虐场 然后某蒟蒻不会做,所以也出了一个字符串题: 题目描述 给你一个字符串a,每次询问一段区间的贡献 贡献定义: 每次从这个区 ...
- P3709 大爷的字符串题(50分)
题目背景 在那遥远的西南有一所学校 /*被和谐部分*/ 然后去参加该省省选虐场 然后某蒟蒻不会做,所以也出了一个字符串题: 题目描述 给你一个字符串a,每次询问一段区间的贡献 贡献定义: 每次从这个区 ...
- luogu 3709 大爷的字符串题 构造 莫队 区间众数
题目链接 题目描述 给你一个字符串a,每次询问一段区间的贡献 贡献定义: 每次从这个区间中随机拿出一个字符\(x\),然后把\(x\)从这个区间中删除,你要维护一个集合S 如果\(S\)为空,你\(r ...
随机推荐
- vue-cli3.0之vue.config.js的配置项(注解)
module.exports = { // 部署应用时的基本 URL baseUrl: process.env.NODE_ENV === 'production' ? '192.168.60.110: ...
- CBV源码分析+APIVIew源码分析
{drf,resful,apiview,序列化组件,视图组件,认证组件,权限组件,频率组件,解析器,分页器,响应器,URL控制器,版本控制} 一.CBV源码分析准备工作: 新建一个Django项目 写 ...
- centos6.8 安装wget
1.执行yum -y install wget 提示:没有相应的包.原因:默认最小化安装没有装wget,而且默认源中没有wget,所以只能先切换源配置. (1)下载.阿里的源配置,并放到/etc/yu ...
- OSError: mysql_config not found
使用Python3开发一个管理平台,用MySQL数据库存放元数据.使用pip安装mysqlclient模块时出现“OSError: mysql_config not found”错误. 解决: # a ...
- $mount(“#app”)手动挂载
没有el属性时,证明vue还没绑定到特定的dom上,需要延迟加载,则使用.$mount("")进行手动挂载 https://blog.csdn.net/longzhoufeng/a ...
- PLSQL过期:Your trial period for PL/SQL Developer is over .If you want to continue using this software ,you must purchase the retail version.
PLSQL过期:Your trial period for PL/SQL Developer is over .If you want to continue using this software ...
- 一、zipkin
zipkin是Twitter基于google的分布式监控系统Dapper(论文)的开发源实现,zipkin用于跟踪分布式服务之间的应用数据链路(具体就是收集微服务之间的调用情况,然后处理调用之间数据延 ...
- c++中结构体sort()排序
//添加函数头 #include <algorithm> //定义结构体Yoy typedef struct { double totalprice; //总价 doubl ...
- DRF 版本 认证
DRF的版本 版本控制是做什么用的, 我们为什么要用 首先我们要知道我们的版本是干嘛用的呢大家都知道我们开发项目是有多个版本的 当我们项目越来越更新~版本就越来越多我们不可能新的版本出了~以前旧的版本 ...
- import logging报错raise notimplementederror 'emit must be implemented ' ^
在导入logging的时候出现这个错误 大概看了一下,就是因为python内置里面已经有logging这个模块,所以不需要再安装 在site-packages里面找到关于logging的文件,删掉 重 ...