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. Gradle初使用

    我以前一直使用Maven来构建工程,这两天突然发现gradle也非常好用,记录一下自己使用gradle的过程. Gradle的下载与配置 本次选择下载的是gradle3.5版本,没选最新的gradle ...

  2. Redis 指令

    一个key可以存放将近40亿条数据 选择库    select 2  (代表选择第三个库) 增加key  set db_number  11 删除key  del key 获取值   get db_n ...

  3. Facebook190亿美元收购WhatsApp

    Facebook收购WhatsApp,前后只花费10天时间.这是Facebook迄今规模最大的一笔收购,可能也是史上最昂贵的一笔针对靠私人风投起家的企业的收购案. 2月9日,马克•扎克伯格(Mark ...

  4. JavaScript变态题目

    刚才发现的一些变态的 JavaScript 题目,做了一下,只对了一半,特此发到园子里,和友友们分享一下.这些题目都是针对 Ecmascript 第三版的,原题里面全部都是选择题,有备选答案,这里我把 ...

  5. Tempter of the Bone HDU 1010(DFS+剪枝)

    Problem Description The doggie found a bone in an ancient maze, which fascinated him a lot. However, ...

  6. Scrum立会报告+燃尽图(十月二十一日总第十二次)

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2246 项目地址:https://git.coding.net/zhang ...

  7. 《JavaScript》页面跳转

    window.location.href: <i onclick="window.location.href = '/Form/Form_Write/Index?viewname=Fo ...

  8. (十一)Jmeter另一种调试工具 HTTP Mirror Server

    之前我介绍过Jmeter的一种调试工具Debug Sampler,它可以输出Jmeter的变量.属性甚至是系统属性而不用发送真实的请求到服务器.既然这样,那么HTTP Mirror Server又是做 ...

  9. php中ob缓存机制

    1.ob缓存运行方式 2.注意:在程序中如果开启ob_start(),所有的echo输出都会保存到ob缓存中,可以使用ob系列函数进行操作,如果没有,默认情况下,在程序执行结束,会把缓存中的数据发送给 ...

  10. HTML5资源站

    前端里:http://www.yyyweb.com/ http://www.cnblogs.com/html5tricks/p/3925844.html