博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 1878: [SDOI2009]HH的项链( BIT )
阅读量:4967 次
发布时间:2019-06-12

本文共 2223 字,大约阅读时间需要 7 分钟。

离线处理 , 记下询问的左右端点并排序 , 然后可以利用树状数组 , 保证查询区间时每种颜色只计算一次

------------------------------------------------------------------------------------------------

 

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
 
#define rep( i , n ) for( int i = 0 ; i < n ; ++i )
#define clr( x , c ) memset( x , c , sizeof( x ) )
#define lowbit( x ) (x & -x)
#define Rep( i , n ) for( int i = 1 ; i <= n ; ++i )
 
using namespace std;
  
const int maxn = 50000 + 5;
const int maxq = 200000 + 5;
const int MAXN = 1000000 +5;
 
int b[ maxn ];
int n;
  

inline void add( int x ) {

if( ! x ) return;
for( ; x <= n ; x += lowbit( x ) )
   b[ x ] += 1;
}
 
inline int sum( int x ) {
int ans = 0;
for( ; x > 0 ; x -= lowbit( x ) )
   ans += b[ x ];
return ans;
}
 
int next[ MAXN ];
int last[ MAXN ];
int x[ maxn ];
 
struct Q {
int l , r;
int x;
inline void Read( int _x ) {
scanf( "%d%d" , &l , &r );
x = _x;
}
bool operator < ( const Q &rhs ) const {
return l < rhs.l;
}
};
 
Q q[ maxq ];
int ans[ maxq ];
 
int main() {
freopen( "test.in" , "r" , stdin );
clr( b , 0 );
clr( last , -1 );
clr( next , 0 );
cin >> n;
Rep( i , n ) {
scanf( "%d" , &x[ i ] );
if( last[ x[ i ] ] != -1 ) 
   next[ last[ x[ i ] ] ] = i;
else 
   add( i );
   
last[ x[ i ] ] = i;
}
int m;
cin >> m;
rep( i , m ) q[ i ].Read( i );
sort( q , q + m );
int s = 1;
rep( i , m ) {
while( s < q[ i ].l ) {
add( next[ s ] );
s++;
}
ans[ q[ i ].x ]= sum( q[ i ] .r ) - sum( q[ i ].l - 1 );
}
rep( i , m )
   printf( "%d\n" , ans[ i ] );
return 0;
}

------------------------------------------------------------------------------------------------

1878: [SDOI2009]HH的项链

Time Limit: 4 Sec  
Memory Limit: 64 MB
Submit: 2117  
Solved: 1043
[ ][ ][ ]

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

 

转载于:https://www.cnblogs.com/JSZX11556/p/4541099.html

你可能感兴趣的文章
Python学习笔记8(2)——序列的方法
查看>>
P3084 [USACO13OPEN]照片Photo
查看>>
matlab读取cvs文件的几种方法
查看>>
谈谈iOS Animation
查看>>
如何设置eclipse新建工程内文件的默认编码格式
查看>>
46. Permutations
查看>>
170. Two Sum III - Data structure design
查看>>
背包九讲之四(混合三种背包问题)
查看>>
hdu2544(自己实现优先队列)
查看>>
南阳242
查看>>
shell脚本去重的几种方法
查看>>
【完全开源】百度地图Web service API C#.NET版,带地图显示控件、导航控件、POI查找控件...
查看>>
Ubuntu 12.04 the system is running in low-graphics mode
查看>>
iOS开发编码建议与编程经验(书写规范)
查看>>
gerrit使用
查看>>
C博客作业01--分支、顺序结构
查看>>
递归求任意数字之间的和
查看>>
FCC 16个初级算法解
查看>>
盒子的水平垂直居中几种方法
查看>>
团队项目简易聊天室开发NABCD分析
查看>>