Description

个人觉得这是这道题最难的一步...出题人的语文...

每次给出一个区间,求这个区间最少能被多少个单调上升的序列覆盖。

Solution

这个东西可以转化为这个区间中出现次数最多的数的出现次数(很好理解吧)

然后用莫队维护两个东西

  1. \(cnt_x\) 表示 \(x\) 的出现次数
  2. \(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 大爷的字符串题】的更多相关文章

  1. [luogu3709][大爷的字符串题]

    题目链接 题意 一天做到两道这种题目描述如此神仙的题也是够了.真锻炼语文能力. 题目的意思其实就是,给你一个序列,然后每次询问一个区间.使得尽量按照严格上升的顺序从这个区间内取数.如果当前取得数字小于 ...

  2. luogu P3709 大爷的字符串题

    二次联通门 : luogu P3709 大爷的字符串题 /* luogu P3709 大爷的字符串题 莫队 看了半天题目 + 题解 才弄懂了要求什么... 维护两个数组 一个记录数字i出现了几次 一个 ...

  3. P3709 大爷的字符串题 (莫队)

    题目 P3709 大爷的字符串题 题意:求\([l,r]\)中众数的个数. 解析 维护两个数组: \(cnt[x]\),数\(x\)出现的次数. \(sum[x]\),出现次数为\(x\)的数的个数. ...

  4. AC日记——大爷的字符串题 洛谷 P3709

    大爷的字符串题 思路: 莫队,需开O2,不开50: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 20000 ...

  5. P3709 大爷的字符串题(莫队+结论)

    题目 P3709 大爷的字符串题 做法 有一个显然的结论:一段区间里最小答案为众数的个数 用莫队来离线求众数 \(tmp_i\)表示出现\(i\)次的数的个数,\(num_i\)表示\(i\)出现的次 ...

  6. 洛谷P3709 大爷的字符串题(莫队)

    题目背景 在那遥远的西南有一所学校 /*被和谐部分*/ 然后去参加该省省选虐场 然后某蒟蒻不会做,所以也出了一个字符串题: 题目描述 给你一个字符串a,每次询问一段区间的贡献 贡献定义: 每次从这个区 ...

  7. 洛谷 P3709 大爷的字符串题

    https://www.luogu.org/problem/show?pid=3709 题目背景 在那遥远的西南有一所学校 /*被和谐部分*/ 然后去参加该省省选虐场 然后某蒟蒻不会做,所以也出了一个 ...

  8. P3709 大爷的字符串题(50分)

    题目背景 在那遥远的西南有一所学校 /*被和谐部分*/ 然后去参加该省省选虐场 然后某蒟蒻不会做,所以也出了一个字符串题: 题目描述 给你一个字符串a,每次询问一段区间的贡献 贡献定义: 每次从这个区 ...

  9. luogu题解 P3709 【大爷的字符串题】

    题目链接: https://www.luogu.org/problemnew/show/P3709 思路: 首先我是没读懂题目的,浏览了讨论区的dalao发现才知道就是求区间众数的出现次数. 然后肯定 ...

随机推荐

  1. 阿里IPO法律咨询费达1580万美元 为Facebook六倍

    据路透社报道,阿里巴巴集团周五在 IPO (首次公开招股)更新文件中披露,将向美国盛信律师事务所(Simpson Thacher)以及其他为 IPO 提供咨询服务的律师事务所支付 1580 万美元的法 ...

  2. 无法设置主体sa的凭据

    设置允许SQL Server身份登录 1.先用Window方式登陆进去,选择数据库实例,右键选择属性——安全性:把服务器身份验证选项从“Window身份验证模式”改为“SQLServer和Window ...

  3. kylin-note

    http://www.cnblogs.com/tgzhu/category/915975.html https://sdk.cn/news/3566 https://www.linuxidc.com/ ...

  4. DFS(DP)---POJ 1014(Dividing)

    原题目:http://poj.org/problem?id=1014 题目大意: 有分别价值为1,2,3,4,5,6的6种物品,输入6个数字,表示相应价值的物品的数量,问一下能不能将物品分成两份,是两 ...

  5. Swift-存储属性,计算属性,类属性

    //类的属性定义 class Student: NSObject { // 定义属性 // 定义存储属性 var age : Int = var name :String? var mathScore ...

  6. form表单元素中disabled的元素的值不会提交到服务器

    1.表单元素中disabled的元素的值不会提交到服务器,后台获取的值为null <form id="myForm" action="#" method= ...

  7. 常用的一些sql

    --根据某一列中包括的逗号将一行数据变多行 select a,c from (with test as (select 'abc' a,'1,2,3' c from dual e) select a, ...

  8. sharepoint content type publishing

    1. Create 1 Project Team sites (Site1) on SharePoint(可以用普通site)2. Go to http://<PCName>:8080/_ ...

  9. Spring学习-1 框架总览

    Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架. spring ...

  10. [C/C++] 虚函数机制

    转自:c++ 虚函数的实现机制:笔记 1.c++实现多态的方法 其实很多人都知道,虚函数在c++中的实现机制就是用虚表和虚指针,但是具体是怎样的呢?从more effecive c++其中一篇文章里面 ...