Luogu4113 [HEOI2012]采花
题目大意:给定一个长度为$n$的序列$a_i$,$m$次询问,每次询问$[l,r]$,求在区间内有多少个数出现了至少2次。
数据范围:$1\leq l\leq r\leq n\leq 2*10^6,1\leq m,a_i\leq 2*10^6$
首先我们考虑设$pre_i$表示上一个与$a_i$相等的位置。
所以$a_i$对答案有贡献当且仅当$l\leq pre_i<i\leq r$
这是一个经典的二维数点问题,cdq分治可以解决,但是。。。
所以我们换一种更优的做法,我们每次遍历到一个位置$a_i$的时候,考虑如果$l\leq pre_i<i\leq r$的时候,$i$会有贡献。
设$c_i$表示当前每个位置的贡献,所以对于上面的情况,令$c_{pre_{pre_i}}--,c_{pre_i}++$,因为这时之前要求$l\leq pre_{pre_i}$,现在只用$l\leq pre_i$了。
如果$r=i$,那么答案就是$\sum_{i=l}^rc_i$。所以可以离线下来之后用树状数组维护。
- #include<bits/stdc++.h>
- #define Rint register int
- using namespace std;
- const int N = ;
- int n, mx, m, a[N], num[N], lst[N], ans[N], now = ;
- struct Query {
- int l, r, id;
- inline bool operator < (const Query &o) const {return r < o.r;}
- } q[N];
- int c[N];
- inline int lowbit(int x){return x & -x;}
- inline void change(int pos, int val){
- while(pos <= n){
- c[pos] += val;
- pos += lowbit(pos);
- }
- }
- inline int query(int pos){
- int res = ;
- while(pos){
- res += c[pos];
- pos -= lowbit(pos);
- }
- return res;
- }
- int main(){
- scanf("%d%d%d", &n, &mx, &m);
- for(Rint i = ;i <= n;i ++){
- scanf("%d", a + i);
- lst[i] = num[a[i]];
- num[a[i]] = i;
- }
- for(Rint i = ;i <= m;i ++){
- scanf("%d%d", &q[i].l, &q[i].r);
- q[i].id = i;
- }
- sort(q + , q + m + );
- for(Rint i = ;i <= m;i ++){
- while(now <= q[i].r){
- if(lst[now]) change(lst[now], );
- if(lst[lst[now]]) change(lst[lst[now]], -);
- ++ now;
- }
- ans[q[i].id] = query(q[i].r) - query(q[i].l - );
- }
- for(Rint i = ;i <= m;i ++)
- printf("%d\n", ans[i]);
- }
Luogu4113
Luogu4113 [HEOI2012]采花的更多相关文章
- BZOJ 2743: [HEOI2012]采花
2743: [HEOI2012]采花 Time Limit: 15 Sec Memory Limit: 128 MBSubmit: 2056 Solved: 1059[Submit][Status ...
- [bzoj2743][HEOI2012]采花(树状数组+离线)
2743: [HEOI2012]采花 Time Limit: 15 Sec Memory Limit: 128 MBSubmit: 1832 Solved: 954[Submit][Status] ...
- BZOJ 2743: [HEOI2012]采花( 离线 + BIT )
处理出每个数下一个出现的位置, 然后按左端点排序回答询问.处理当前数去除的影响 ------------------------------------------------------------ ...
- BZOJ_2743_[HEOI2012]采花_离线+树状数组
BZOJ_2743_[HEOI2012]采花_离线+树状数组 Description 萧芸斓是Z国的公主,平时的一大爱好是采花.今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花 .花园足够大 ...
- BZOJ 2743: [HEOI2012]采花 离线树状数组
2743: [HEOI2012]采花 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2743 Description 萧芸斓是Z国的公主, ...
- 【BZOJ2743】[HEOI2012]采花 离线+树状数组
[BZOJ2743][HEOI2012]采花 Description 萧芸斓是Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了n朵花, ...
- cogs:1619. [HEOI2012]采花/luogu P2056
1619. [HEOI2012]采花 ★★☆ 输入文件:1flower.in 输出文件:1flower.out 简单对比时间限制:5 s 内存限制:128 MB [题目描述] 萧薰儿是 ...
- 1619. [HEOI2012]采花
1619. [HEOI2012]采花 ★★☆ 输入文件:1flower.in 输出文件:1flower.out 简单对比 时间限制:5 s 内存限制:128 MB [题目描述] 萧薰儿 ...
- cogs1619. [HEOI2012]采花 x
1619. [HEOI2012]采花 ★★☆ 输入文件:1flower.in 输出文件:1flower.out 简单对比时间限制:5 s 内存限制:128 MB [题目描述] 萧薰儿是 ...
随机推荐
- 51nod--1069 Nim 游戏(博弈论)
题目: 有N堆石子.A B两个人轮流拿,A先拿.每次只能从一堆中取若干个,可将一堆全取走,但不可不取,拿到最后1颗石子的人获胜.假设A B都非常聪明,拿石子的过程中不会出现失误.给出N及每堆石子的数量 ...
- 【原创】运维基础之Docker(4)实用工具ctop
ctop类似于top,top监控的是进程,ctop监控的是容器(container top) 安装 # wget https://github.com/bcicen/ctop/releases/dow ...
- jdbc连接sqlserver,mysql,oracle
class xxx{ private static String port = "1433"; private static String ip = "192.168.2 ...
- 微信小程序支付开发之申请退款
微信小程序支付跟微信公众号支付类似,这里不另做记录,如果没有开发过支付,可以查看我关于微信支付的文章 重点记录微信小程序申请退款开发过程中遇到一些坑. 退款接口比支付接口接口多了一个 双向证书 证书介 ...
- CSS之链接
改变链接样式 当设置为若干链路状态的样式,也有一些顺序规则: a:hover 必须跟在 a:link 和 a:visited后面 a:active 必须跟在 a:hover后面 <!DOCTYP ...
- Punycode
Punycode是一个根据RFC 3492标准而制定的编码系统,主要用于把域名从地方语言所采用的Unicode编码转换成为可用于DNS系统的编码 “中文域名”不被标准的解析服务器支持,需转化为Puny ...
- skywalking6.0.0安装配置(windows),以mysql作为储存。
下载skywalking6.0.0http://skywalking.apache.org/downloads/ 下载jdk8https://www.oracle.com/technetwork/ja ...
- Python学习之MySQLdb模块
摘要: MySQLdb模块用于操作mysql数据库.1.安装MySQLdb模块 yum install MySQL-python -y2.操作流程①.导入模块: import MySQLdb②.连接数 ...
- add, subtract, multiply, divide
加.减.乘.除:add, subtract, multiply, divide
- python 将list的值赋值给变量
list中有n个值,赋值给k个变量:a1, a2, ……,ak n = k时:a1, a2, ……,ak = list n > k时:使用1式报错:ValueError: too many va ...