题解【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发现才知道就是求区间众数的出现次数. 然后肯定 ...
随机推荐
- SVN部署与简单使用
原文发表于cu:2016-05-24 参考文档: http://www.tuicool.com/articles/Yv2iyu7 http://www.centoscn.com/CentosServe ...
- java-HttpGetPost-图片字节流上传
在java程序开发中经常用到与服务端的交互工作,主要的就是传递相应的参数请求从而获取到对应的结果加以处理 可以使用Get请求与Post请求,注意!这里的Get请求不是通过浏览器界面而是在程序代码中设置 ...
- Python:内建函数zip
1.语法 zip([iterable,...]) [说明]:iterable——一个或多个迭代器 2.功能 zip()函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个的元组,然后返回由这 ...
- lintcode-496-玩具工厂
496-玩具工厂 工厂模式是一种常见的设计模式.请实现一个玩具工厂 ToyFactory 用来产生不同的玩具类.可以假设只有猫和狗两种玩具. 您在真实的面试中是否遇到过这个题? Yes 样例 ToyF ...
- Spark Shuffle之Hash Shuffle
源文件放在github,如有谬误之处,欢迎指正.原文链接https://github.com/jacksu/utils4s/blob/master/spark-knowledge/md/hash-sh ...
- ctf实验平台-成绩单
题目链接:http://120.24.86.145:8002/chengjidan/ 平台地址:http://123.206.31.85/ 第一步:暴库 id=-1' union select 1,2 ...
- LR之Java Vuser II
最近项目待压测的服务端协议使用的是java的Netty框架开发,而传输的业务数据使用了google protobuf进行序列化,然后通过tcp数据流与客户端通讯.这一次的压测脚本决定使用LR的java ...
- 小工具xml生成记录
public partial class Form1 : Form { public Form1() { InitializeComponent ...
- brush
简介 Brushing是一个通过点击或触摸来选择一个一维或二维区域的交互操作,比如可以通过点击鼠标并移动. brush经常被用来选择离散的元素比如散点图中的点或桌面上的文件等.它也可以被用来放大选中的 ...
- nginx & restart
nginx & restart https://www.cyberciti.biz/faq/nginx-linux-restart/