【bzoj1878】[SDOI2009]HH的项链 树状数组+离线
2016-03-29 21:43
417 查看
Description
HH有一串由各种漂亮的贝壳组成的项链。HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一段贝壳,思考它们所表达的含义。HH不断地收集新的贝壳,因此, 他的项链变得越来越长。有一天,他突然提出了一个问题:某一段贝壳中,包含了多少种不同 的贝壳?这个问题很难回答。。。因为项链实在是太长了。于是,他只好求助睿智的你,来解 决这个问题。Input
第一行:一个整数N,表示项链的长度。 第二行:N个整数,表示依次表示项链中贝壳的编号(编号为0到1000000之间的整数)。 第三行:一个整数M,表示HH询问的个数。 接下来M行:每行两个整数,L和R(1 ≤ L ≤ R ≤ N),表示询问的区间。Output
M行,每行一个整数,依次表示询问对应的答案。Sample Input
6 1 2 3 4 3 5 3 1 2 3 5 2 6
Sample Output
2 2 4
HINT
对于20%的数据,N ≤ 100,M ≤ 1000;对于40%的数据,N ≤ 3000,M ≤ 200000;
对于100%的数据,N ≤ 50000,M ≤ 200000。
Source
Day2离线做法是按坐标排序,然后维护个前缀和。
对于同种颜色挂个链表,若正在考虑的区间包含x则x在此区间第一次出现位置为1其余为0。若区间左端点越过x出现的位置i则nxt[i]++,这样可以保证同种颜色只被计算一次,一直往前推就行了
树状数组就可以维护前缀和。
强制在线好像要主席树?
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; typedef long long LL; const int SZ = 1000010; int head[SZ],nxt[SZ]; struct haha{ int x,y,id,ans; }ask[SZ]; bool cmp1(haha a,haha b) { return a.x == b.x ? a.y < b.y : a.x < b.x; } bool cmp2(haha a,haha b) { return a.id < b.id; } int sum[SZ],n; void add(int pos,int d) { for(int i = pos;i <= n;i += i & -i) sum[i] += d; } int asksum(int pos) { int ans = 0; for(int i = pos;i >= 1;i -= i & -i) ans += sum[i]; return ans; } int num[SZ]; int main() { scanf("%d",&n); for(int i = 1;i <= n;i ++) scanf("%d",&num[i]); for(int i = n;i >= 1;i --) { int x = num[i]; if(!head[x]) head[x] = i; else nxt[i] = head[x],head[x] = i; } int m; scanf("%d",&m); for(int i = 1;i <= m;i ++) scanf("%d%d",&ask[i].x,&ask[i].y),ask[i].id = i; sort(ask + 1,ask + 1 + m,cmp1); for(int i = 0;i <= 1000000;i ++) if(head[i]) add(head[i],1); for(int i = 1,j = 1;i <= m;i ++) { // cout<<i<<" "<<j<<endl; while(j < ask[i].x) { if(asksum(j)) { add(j,-1); if(nxt[j]) add(nxt[j],1); } j ++; } ask[i].ans = asksum(ask[i].y) - asksum(ask[i].x - 1); } sort(ask + 1,ask + 1 + m,cmp2); for(int i = 1;i <= m;i ++) printf("%d\n",ask[i].ans); return 0; }
相关文章推荐
- 遗传算法在游戏中的应用——y=x^2
- getHibernateTemplate()的用法
- Mockito单元测试——方法参数
- 本周游戏体验:卧虎藏龙
- PopupWindow
- C/C++ 获取文件夹下的所有文件列表
- 初识类与对象01
- JavaScript学习笔记2(草稿)
- Mockito单元测试——verify
- 1008 加工木棍问题
- C/C++ 获取文件夹下的所有文件列表
- Android Studio--ListView
- 结合实例详解clone()函数,Cloneable接口以及深拷贝与浅拷贝的问题
- C++ 构造函数或析构函数调用虚函数
- 0329 复利计算器5.0 Juint单元测试 组员 254列志华 253韩麒麟
- 蜜の夜明け
- 希尔排序
- Mockito 单元测试简介以及Stub
- A*算法实现
- hdu 1548 A strange lift 最短路 spfa模板