【BZOJ】1878: [SDOI2009]HH的项链(树状数组)
http://www.lydsy.com/JudgeOnline/problem.php?id=1878
我太弱了,看题解才过的。
一开始看到此题,我想了想在线做法,但之后觉得这个想法可能是错的:维护一颗splay,按输入顺序建树,将相同节点缩点,维护2个值,一个是size,为节点数量,一个是size2,为不同节点数量,然后取区间操作即可。但是后来想想,此方法应该不行,因为在掉区间的时候,,你把点缩掉了。。。。。。。。。。。。。。。。。。
写这篇文章的时候又想到一个做法。。。维护2颗splay,一颗为正常的,用来取区间,一颗为缩点的。说下做法吧,在正常的树上取了区间后,在此区间求最左边的值,用这个值放去缩点的splay上伸展到根,然后左子树的size就是答案啦~~
来说这题的做法:
首先我是用离线的,用树状数组维护前缀和。
找出每个数第一次出现的位置,记为ihead[u],并且记录每个数的相同数的下一个位置,记为inext[i]。
然后将每一个头先加入前缀后,即将所有的ihead[u]加入到前缀和中去。
接下来将所有的询问以l排序。
从左往右扫,如果在i这个询问前有inext,那么就全部加上去。。。。因为头已经在外面了,所以要将里面的加进去。。
#include <cstdio>
#include <algorithm>
using namespace std;
#define lowbit(x) (x&-x)
#define max(a,b) ((a)>(b)?(a):(b)) const int N=50005, M=200005;
int bit[N], a[N], n, m, ihead[1000005], inext[N];
struct Q {
int l, r, id, ans;
}q[M];
bool cmp1(const Q &a, const Q &b) { return a.l==b.l?a.r<b.r:a.l<b.l; }
bool cmp2(const Q &a, const Q &b) { return a.id<b.id; } inline int read() {
int ret=0; char c;
for(c=getchar(); c<'0' || c>'9'; c=getchar());
for(; c>='0' && c<='9'; c=getchar()) ret=ret*10+c-'0';
return ret;
}
inline void add(int x, const int &y) { while(x<=n) bit[x]+=y, x+=lowbit(x); }
inline int sum(int x) { int ret=0; while(x>0) ret+=bit[x], x-=lowbit(x); return ret; } int main() {
n=read();
int i, maxi=0, l=1;
for(i=1; i<=n; ++i) a[i]=read(), maxi=max(maxi, a[i]);
for(i=n; i>=0; --i) inext[i]=ihead[a[i]], ihead[a[i]]=i;
for(i=0; i<=maxi; ++i) if(ihead[i]) add(ihead[i], 1);
m=read();
for(i=1; i<=m; ++i) q[i].l=read(), q[i].r=read(), q[i].id=i;
sort(q+1, q+1+m, cmp1);
for(i=1; i<=m; ++i) {
while(l<q[i].l) {
if(inext[l]) add(inext[l], 1);
++l;
}
q[i].ans=sum(q[i].r)-sum(q[i].l-1);
}
sort(q+1, q+1+m, cmp2);
for(i=1; i<=m; ++i) printf("%d\n", q[i].ans);
return 0;
}
Description
Input
Output
Sample Input
1 2 3 4 3 5
3
1 2
3 5
2 6
Sample Output
2
4
HINT
对于20%的数据,N ≤ 100,M ≤ 1000;
对于40%的数据,N ≤ 3000,M ≤ 200000;
对于100%的数据,N ≤ 50000,M ≤ 200000。
Source
【BZOJ】1878: [SDOI2009]HH的项链(树状数组)的更多相关文章
- bzoj 1878: [SDOI2009]HH的项链 ——树状数组+ 差分
Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一 段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此他的项链变得 ...
- BZOJ 1878 SDOI2009 HH的项链 树状数组/莫队算法
题目大意:给定一个序列.求一个区间内有多少个不同的数 正解是树状数组 将全部区间依照左端点排序 然后每次仅仅统计左端点開始的每种颜色的第一个数即可了 用树状数组维护 我写的是莫队算法 莫队明显能搞 m ...
- [SDOI2009]HH的项链 树状数组 BZOJ 1878
题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的贝壳,因此,他的项链 ...
- 【题解】P1972 [SDOI2009]HH的项链 - 树状数组
P1972 [SDOI2009]HH的项链 声明:本博客所有题解都参照了网络资料或其他博客,仅为博主想加深理解而写,如有疑问欢迎与博主讨论✧。٩(ˊᗜˋ)و✧*。 题目描述 \(HH\) 有一串由各种 ...
- [BZOJ1878] [SDOI2009] HH的项链 (树状数组)
Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此, 他的项链变 ...
- 【bzoj1878】[SDOI2009]HH的项链 树状数组
题目描述 HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此, 他的项链变得越来越长.有一 ...
- 【bzoj1878】[SDOI2009]HH的项链 - 树状数组 - 离线处理
[SDOI2009]HH的项链 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 4834 Solved: 2384[Submit][Status][Dis ...
- bzoj1878 [SDOI2009]HH的项链——树状数组
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1878 离线树状数组,巧妙的思路呢: 给每种项链记录一个最后出现的位置lst,根据项链最后出现 ...
- luogu P1972 [SDOI2009]HH的项链 |树状数组 或 莫队
题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的贝壳,因此,他的项链变得越来越长. ...
- 洛谷 P1972 [SDOI2009]HH的项链——树状数组
先上一波题目 https://www.luogu.org/problem/P1972 这道题是询问区间内不同数的个数 明显不是正常的数据结构能够维护的 首先考虑 因为对于若干个询问的区间[l,r],如 ...
随机推荐
- linux下cp目录时排除一个或者多个目录的方法
说明:/home目录里面有data目录,data目录里面有a.b.c.d.e五个目录,现在要把data目录里面除过e目录之外的所有目录拷贝到/bak目录中 系统运维 www.osyunwei.com ...
- Scrapy and Selenium
How to scrapy js? scrapy结合webkit抓取js生成的页面 http://www.cnblogs.com/Safe3/archive/2011/10/19/2217965.ht ...
- nested exception is org.xml.sax.SAXParseException; lineNumber: 8; columnNumber: 56; cvc-complex-type.2.4.c通配符的匹配很全面, 但无法找到元素 'dubbo:application' 的声明
严重: Exception sending context initialized event to listener instance of class org.springframework.we ...
- Java for LeetCode 051 N-Queens
Given an integer n, return all distinct solutions to the n-queens puzzle. Each solution contains a d ...
- codeforces A. Vasily the Bear and Triangle 解题报告
题目链接:http://codeforces.com/problemset/problem/336/A 好简单的一条数学题,是8月9日的.比赛中没有做出来,今天看,从pupil变成Newbie了,那个 ...
- AJAX省市县三级联动
效果 开发结构参考AJAX,JSON用户校验 主要有两个核心文件 1,处理输入字符,进行后台搜索的servlet linkage.java package org.guangsoft.servlet; ...
- Mysql常用函数列举
1,HEX(),十六进制转化;eg:select HEX('mysql'); select X'6D7973716C'; 2,bit_count(),计算二进制数中包含1的个数;bit_or(),对两 ...
- 安装及升级node
一.mac下安装 1. 可直接在官网下载(http://nodejs.cn/),可使用命令查看版本: node -v node --version 同样npm同时也安装下来,可使用下面命令查看: np ...
- Servlet获取参数
package action; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.Servlet ...
- C#的面向对象特性之封装
在C#语言中,共有五种访问修饰符:public.private.protected.internal.protected internal. public 公有访问.不受任何限制.private 私有 ...