题解【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发现才知道就是求区间众数的出现次数. 然后肯定 ...
随机推荐
- 多重共性和VIF检验
图片来源https://wenku.baidu.com/view/7008df8383d049649b66581a.html 和 https://wenku.baidu.com/view/6acdf9 ...
- Github三次学习
作者声明:本文参照aicoder.com马伦老师的文档,根据自己的学习情况而做的笔记,仅供交流学习. Git入门到高级教程 为什么要进行项目文件的版本管理 代码备份和恢复 团队开发和协作流程 项目分支 ...
- “Hello World!”团队第三周召开的第二次会议
今天是我们团队“Hello World!”团队第三周召开的第二次会议.博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.todo list 六.会议照片 七.燃尽图 一.会议时间 ...
- Android数据储存之SQLiteDatabase 简单增删改查
SQLiteDatabase 使用 SQLiteDatabase提供如下方法来打开一个文件对应的数据库: openDatabase(String path, SQLiteDatabase.Cursor ...
- Ubuntu环境下No module named '_tkinter'错误的解决
在Ubuntu环境下运行下面代码: import matplotlib as plt 出现以下错误: No module named '_tkinter' 解决方法: sudo apt-get ins ...
- SDN练习一
SDN练习第一题 题目描述 实现网络拓扑: 具体要求: 南向接口采用OpenFlow 协议. 可查看网络的拓扑信息视图. H1.H2.H3.H4 任意两两可互通. 实现思路 利用mininet可视化图 ...
- Nodejs学习笔记(二)--- 操作MongoDB数据库
最近看了一些关于mongodb的文章,然后就想知道nodeJS是怎么连接的所以我就尝试去了解了一波(这个菜鸟驿站这个网站还不错,虽然知识文档不是最新的,但是还是蛮好的: 顺便官网地址是这个哦:http ...
- HTML图片标签
<body> <!-- 使用img标签来向网页中引入外部的图片, img标签也是一个自结束标签 属性: src:设置一个外部图片的路径 alt:可以用来设置图片不能显示时,就会显示图 ...
- jQuery的滚动监听
jQuery的滚动监听 1.当前滚动的地方的窗口顶端到整个页面顶端的距离: var winPos = $(window).scrollTop(); 2.获取指定元素的页面位置: $(val).offs ...
- 微信获取 openid 静默及非静默
<?php /* 需要的微信公众号配置信息 APPID : 绑定支付的APPID APPSECRET : 公众帐号secert */ class Index { // 配置账号信息 privat ...