题解【luogu3709 大爷的字符串题】
Description
个人觉得这是这道题最难的一步...出题人的语文...
每次给出一个区间,求这个区间最少能被多少个单调上升的序列覆盖。
Solution
这个东西可以转化为这个区间中出现次数最多的数的出现次数(很好理解吧)
然后用莫队维护两个东西
- \(cnt_x\) 表示 \(x\) 的出现次数
 - \(num_x\) 表示有多少个数出现次数是 \(x\)
 
用这两个东西可以方便地维护答案 ans。
加入 \(x\) 就是 num[cnt[x]]--; cnt[x]++; num[cnt[x]]++
删除 \(x\) 麻烦一些。
若 \(cnt_x = ans\) 并且 \(num_{cnt_x}=1\) ,那么 ans 要减 \(1\) (为什么 ans - 1 合法呢?因为删除之后这个数的出现次数就是 ans - 1)
如果不满足上面的这个条件,那么 ans 就不会有变化。最后记得 num[cnt[x]]--; cnt[x]--; num[cnt[x]]++
Code
#include <bits/stdc++.h>
using namespace std;
const int N = 200200;
int n, m, cnt[N], num[N], blo, A[N], a[N], ans, aans[N];
struct node {
  int l, r, id;
  inline bool operator < (const node &x) const {
    return l / blo == x.l / blo ? r < x.r : l / blo < x.l / blo;
  }
} Q[N];
inline void add(int x) {
  num[cnt[a[x]]]--; num[++cnt[a[x]]]++;
  ans = max(ans, cnt[a[x]]);
}
inline void del(int x) {
  if(cnt[a[x]] == ans
    && num[cnt[a[x]]] == 1)
      ans--;
  num[cnt[a[x]]]--;
  num[--cnt[a[x]]]++;
}
int main() {
  scanf("%d %d", &n, &m); blo = sqrt(m); int nn = n;
  for(int i = 1; i <= n; i++) scanf("%d", &A[i]), a[i] = A[i];
  sort(A + 1, A + n + 1); n = unique(A + 1, A + n + 1) - A - 1;
  for(int i = 1; i <= nn; i++) a[i] = lower_bound(A + 1, A + n + 1, a[i]) - A;
  for(int i = 1; i <= m; i++) {
    scanf("%d %d", &Q[i].l, &Q[i].r); Q[i].id = i;
  } sort(Q + 1, Q + m + 1);
  int L = 0, R = 0;
  for(int i = 1; i <= m; i++) {
    int l = Q[i].l, r = Q[i].r;
    while(L > l) add(--L);
    while(R < r) add(++R);
    while(L < l) del(L++);
    while(R > r) del(R--);
    aans[Q[i].id] = -ans;
  }
  for(int i = 1; i <= m; i++) printf("%d\n", aans[i]);
  return 0;
}
												
											题解【luogu3709 大爷的字符串题】的更多相关文章
- [luogu3709][大爷的字符串题]
		
题目链接 题意 一天做到两道这种题目描述如此神仙的题也是够了.真锻炼语文能力. 题目的意思其实就是,给你一个序列,然后每次询问一个区间.使得尽量按照严格上升的顺序从这个区间内取数.如果当前取得数字小于 ...
 - luogu P3709 大爷的字符串题
		
二次联通门 : luogu P3709 大爷的字符串题 /* luogu P3709 大爷的字符串题 莫队 看了半天题目 + 题解 才弄懂了要求什么... 维护两个数组 一个记录数字i出现了几次 一个 ...
 - 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\)出现的次 ...
 - 洛谷P3709 大爷的字符串题(莫队)
		
题目背景 在那遥远的西南有一所学校 /*被和谐部分*/ 然后去参加该省省选虐场 然后某蒟蒻不会做,所以也出了一个字符串题: 题目描述 给你一个字符串a,每次询问一段区间的贡献 贡献定义: 每次从这个区 ...
 - 洛谷 P3709 大爷的字符串题
		
https://www.luogu.org/problem/show?pid=3709 题目背景 在那遥远的西南有一所学校 /*被和谐部分*/ 然后去参加该省省选虐场 然后某蒟蒻不会做,所以也出了一个 ...
 - P3709 大爷的字符串题(50分)
		
题目背景 在那遥远的西南有一所学校 /*被和谐部分*/ 然后去参加该省省选虐场 然后某蒟蒻不会做,所以也出了一个字符串题: 题目描述 给你一个字符串a,每次询问一段区间的贡献 贡献定义: 每次从这个区 ...
 - luogu题解 P3709 【大爷的字符串题】
		
题目链接: https://www.luogu.org/problemnew/show/P3709 思路: 首先我是没读懂题目的,浏览了讨论区的dalao发现才知道就是求区间众数的出现次数. 然后肯定 ...
 
随机推荐
- python怎么安装requests、beautifulsoup4等第三方库
			
零基础学习python最大的难题之一就是安装所有需要的软件,下面来简单介绍一下如何安装用pip安装requests.beautifulsoup4等第三方库: 方法/步骤 点击开始,在运行里 ...
 - Vue工作原理小结
			
本文能帮你做什么?1.了解vue的双向数据绑定原理以及核心代码模块2.缓解好奇心的同时了解如何实现双向绑定为了便于说明原理与实现,本文相关代码主要摘自vue源码, 并进行了简化改造,相对较简陋,并未考 ...
 - 深度系统(deepin)与win10双系统切换设置
			
之前在win10下安装了深度系统,我不知道其他人在双系统切换的时候是否需要更改BIOS参数,我根据我的实际情况给出双系统切换设置的解决方案. 1.开机后进入选项System setup 2.按照下图选 ...
 - 智能客服 利用python运行java代码
			
因为需要在linux中用python来进行分析,顾需要利用python来运行java中语音转文字和文字转语音代码 在python中运行java代码需要利用jpype
 - Codeforces Beta Round #14 (Div. 2) D. Two Paths 树的直径
			
题目链接: http://codeforces.com/contest/14/problem/D D. Two Paths time limit per test2 secondsmemory lim ...
 - Linux安装weblogic
			
一.软件安装 1. 安装前的准备工作 1.1 首先请确认您要安装的WebLogic版本所在的平台已通过了BEA的认证,完整的认证平台列表请参考 http://e-docs.bea.com/wls/ce ...
 - 《DWZ笔记一》<select>动态联动菜单
			
联动菜单,即组合框Combo box,在DWZ文档中对组合框combox的是这样描述的: 在传统的select 用class 定义:class=”combox”, html 扩展:保留原有属性name ...
 - MySQL 查询缓存机制(MySQL数据库调优)
			
查询缓存机制:缓存的是查询语句的整个查询结果,是一个完整的select语句的缓存结果 哪些查询可能不会被缓存 :查询中包含UDF.存储函数.用户自定义变量.临时表.mysql库中系统表.或者包含列级别 ...
 - Linux的计划任务
			
1. 语法格式:Minute Hour DayOfMonth Month DayOfWeek User Command Minute, 每个小时的第几分钟执行该任务Hour,每天的第几个小时执行该任务 ...
 - C#获取当前路径的方法如下
			
1. System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName -获取模块的完整路径. 2. System.Environm ...