[BZOJ 2743] [HEOI 2012] 采花
Description
萧芸斓是Z国的公主,平时的一大爱好是采花。今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花。花园足够大,容纳了 \(n\) 朵花,花有 \(c\) 种颜色(用整数 \(1-c\) 表示),且花是排成一排的,以便于公主采花。公主每次采花后会统计采到的花的颜色数,颜色数越多她会越高兴!同时,她有一癖好,她不允许最后自己采到的花中,某一颜色的花只有一朵。为此,公主每采一朵花,要么此前已采到此颜色的花,要么有相当正确的直觉告诉她,她必能再次采到此颜色的花。由于时间关系,公主只能走过花园连续的一段进行采花,便让女仆福涵洁安排行程。福涵洁综合各种因素拟定了 \(m\) 个行程,然后一一向你询问公主能采到多少朵花(她知道你是编程高手,定能快速给出答案!),最后会选择令公主最高兴的行程(为了拿到更多奖金!)。
Input
第一行四个空格隔开的整数 \(n,c\) 以及 \(m\)。
接下来一行 \(n\) 个空格隔开的整数,每个数在 \([1, c]\) 间,第 \(i\) 个数表示第 \(i\) 朵花的颜色。
接下来 \(m\) 行每行两个空格隔开的整数 \(l\) 和 \(r\) \((l ≤ r)\),表示女仆安排的行程为公主经过第 \(l\) 到第 \(r\) 朵花进行采花。
Output
共 \(m\) 行,每行一个整数,第 \(i\) 个数表示公主在女仆的第 \(i\) 个行程中能采到的花的颜色数。
Sample Input
5 3 5
1 2 2 3 1
1 5
1 2
2 2
2 3
3 5
Sample Output
2
0
0
1
0
HINT
\(1 ≤ n ≤ 10^6,c ≤ n,m ≤10^6\)
Solution
HH的项链加强版。将询问按照左端点排序,设 \(nxt[i]\) 表示下一个与 \(i\) 颜色相同的点的位置。
当扫过点 \(i\) 后,HH的项链是 update(i, -1), update(nxt[i], 1),这里改成 update(nxt[i], -1), update(nxt[nxt[i]], 1) 就好。
Code
#include <cstdio>
#include <algorithm>
const int N = 1000005;
struct Node {
int l, r, id;
bool operator < (const Node &rhs) const {
return l < rhs.l;
}
} b[N];
int nxt[N], pos[N], sum[N], ans[N], a[N], n, c, m;
int read() {
int x = 0; char c = getchar();
while (c < '0' || c > '9') c = getchar();
while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) + (c ^ 48), c = getchar();
return x;
}
void update(int x, int y) {
while (x <= n) sum[x] += y, x += x & (-x);
}
int query(int x) {
int res = 0;
while (x) res += sum[x], x -= x & (-x);
return res;
}
int main() {
n = read(), c = read(), m = read();
for (int i = 1; i <= n; ++i) a[i] = read();
for (int i = n; i; --i) {
if (pos[a[i]]) nxt[i] = pos[a[i]];
pos[a[i]] = i;
}
for (int i = 1; i <= m; ++i) b[i].l = read(), b[i].r = read(), b[i].id = i;
std::sort(b + 1, b + m + 1);
for (int i = 1; i <= c; ++i) if (nxt[pos[i]]) update(nxt[pos[i]], 1);
for (int i = 1, j = 1; i <= n; ++i) {
while (b[j].l == i) ans[b[j].id] = query(b[j].r), ++j;
if (nxt[i]) {
update(nxt[i], -1);
if (nxt[nxt[i]]) update(nxt[nxt[i]], 1);
}
}
for (int i = 1; i <= m; ++i) printf("%d\n", ans[i]);
return 0;
}
[BZOJ 2743] [HEOI 2012] 采花的更多相关文章
- 解题:HEOI 2012 采花
题面 题外话:LYD说他当时看错题了,考场爆零了,然后有了作诗这道题=.= 离线处理询问,按右端点递增排序,然后对于每种花$flw[i]$,我们求一个$pre[flw[i]]$表示这种花上一次出现的位 ...
- [HEOI 2012] 采花
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2743 [算法] 首先预处理nxt[]数组 , 其中 , nxt[i]表示下一个和i号 ...
- [ SDOI 2009 ] HH的项链 & [ HEOI 2012 ] 采花
\(\\\) \(Description\) 给出一个长为\(N\)的序列,\(M\)次询问区间\([L_i,R_i]\)内不同数字的个数. \(N\in [1,5\times 10^4]\),\(M ...
- BZOJ 2743: [HEOI2012]采花
2743: [HEOI2012]采花 Time Limit: 15 Sec Memory Limit: 128 MBSubmit: 2056 Solved: 1059[Submit][Status ...
- BZOJ 2743: [HEOI2012]采花( 离线 + BIT )
处理出每个数下一个出现的位置, 然后按左端点排序回答询问.处理当前数去除的影响 ------------------------------------------------------------ ...
- BZOJ 2743: [HEOI2012]采花 离线树状数组
2743: [HEOI2012]采花 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2743 Description 萧芸斓是Z国的公主, ...
- 洛谷 P2056 BZOJ 2743 [HEOI2012]采花
//表示真的更喜欢洛谷的题面 题目描述 萧芸斓是 Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了 n 朵花,花有 c 种颜色(用整数 ...
- BZOJ 2743 【HEOI2012】 采花
题目链接:采花 这道题一眼看去,一个很显然的想法就是莫队.但是数据范围是\(10^6\)级别的,莫队显然已经过不去了. 其实感觉这道题和以前写过的一道题HH的项链很像.只不过那道题要求的是区间出现次数 ...
- 采花 bzoj 2743
采花(1s 128MB)flower [题目描述] 萧芸斓是Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了n朵花,花有c种颜色(用整 ...
随机推荐
- 【C#复习总结】析构函数
上篇提到析构函数,就顺便复习一下. 一 C# 析构函数 1.1 析构函数的定义 析构函数用于释放被占用的系统资源. 析构函数的名字由符号“-”加类名组成. 1.2 析构函数注意的问题 使用析构函数时, ...
- Dapper简易教程(翻译自Github上StackExchange/Dapper)
本文源自:https://github.com/cnxy/Dapper-zh-cn 本博客作者与Github上作者(cnxy)实为同一个作者.由于笔者翻译水平有限,文本中错误难免,欢迎指正! 本文翻译 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(91)-EF 连接 MySql
前言 虽然系统目前只支持MSSQL版本,但是很多朋友公司技术规定必须使用MySql,下面我们就来使用EF连接MySQL吧! (1)安装MYSQL环境 1.下载安装MYSQL数据,这里我们安装phpSt ...
- docker创建nginx+php-fpm+mysql环境(一分钟搭建lnmp)
下载镜像 docker pull bitnami/php-fpm #下载php-fpm镜像 docker pull nginx #下载nginx镜像docker pull mysql:5.5.59 # ...
- Python魔法函数
python中定义的以__开头和结尾的的函数.可以随意定制类的特性.魔法函数定义好之后一般不需要我们自己去调用,而是解释器会自动帮我们调用. __getitem__(self, item) 将类编程一 ...
- 008-我的博友不锈钢钥匙扣上的随身金属外壳可启动U盘-20190413
008-我的博友不锈钢钥匙扣上的随身金属外壳可启动U盘-20190413
- .call() 和 .apply() 的含义和区别
JavaScript中apply与call的用法意义及区别 apply()与call()的区别 javascript中apply和call方法的作用及区别说明 .apply()用法和call()的区别 ...
- Day5 Pyhton基础之编码与解码(四)
1.编码与解码 1.1现在常用的编码类型
- MySql数据库连接池专题
MySql数据库连接池专题 - aspirant - 博客园https://www.cnblogs.com/aspirant/p/6747238.html
- Visual Studio 2010 Shortcuts
Uploaded by ProNotion, updated on 11/28/2013 by jmb Platform: Windows/ English PDF Print Hide ...