时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld题目描述
HH有一串由各种漂亮的贝壳组成的项链。
HH相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一 段贝壳,思考它们所表达的含义。
HH不断地收集新的贝壳,因此他的项链变得越来越长。
有一天,他突然提出了一 个问题:某一段贝壳中,包含了多少种不同的贝壳?
这个问题很难回答。。。因为项链实在是太长了。于是,他只 好求助睿智的你,来解决这个问题。
输入描述:
第一行:一个整数N,表示项链的长度。 第二行:N个整数,表示依次表示项链中贝壳的编号(编号为0到1000000之间的整数)。 第三行:一个整数M,表示H询问的个数。 接下来M行:每行两个整数,L和R(1 ≤ L ≤ R ≤ N),表示询问的区间。 N ≤ 50000,M ≤ 200000。输出描述:
M行,每行一个整数,依次表示询问对应的答案。示例1
输入
6 1 2 3 4 3 5 3 1 2 3 5 2 6输出
2 2 4备注:
对于20%的数据,1≤n,m≤5000
对于40%的数据,1≤n,m≤1e5
对于60%的数据,1≤n,m≤5×1e5
对于100%的数据,1≤n,m,ai≤1e6,1≤l≤r≤n。树状数组+排序,我很懵比,还得好好理解一下
AC代码:
#include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <vector> #include <queue> #include <string> #include <cstring> #include <map> #include <stack> #include <list> #include <set> #include <istream> #include <sstream> #include <iomanip> #include <numeric> typedef long long ll; typedef double db; typedef unsigned long long ull; const int INF = 0x3f3f3f3f; const double eps = 1e-6; const int N = 1e6 + 10; int n,m; int w[N],tr[N],last[N],ans[N]; struct node{ int id; int l,r; bool operator < (const node &x) const { return r < x.r; } }p[N]; int lowbit(int x){ return x & -x; } void add(int x,int v){ for(int i=x;i<=n;i+=lowbit(i)) tr[i]+=v; } int sum(int x){ int res=0; for(int i=x;i;i-=lowbit(i)) res+=tr[i]; return res; } int main(){ std::cin>>n; for(int i=1;i<=n;i++) std::cin>>w[i]; std::cin>>m; for(int i=1;i<=m;i++) { int l,r; std::cin>>l>>r; p[i]={i,l,r}; } std::sort(p+1,p+1+m); for(int i=1,j=1;i<=m;i++){ int l=p[i].l,r=p[i].r,id=p[i].id; while(j<=r){ if(last[w[j]]) add(last[w[j]],-1); add(j,1); last[w[j]]=j; j++; } ans[id]=sum(r)-sum(l-1); } for(int i=1;i<=m;i++) std::cout<<ans[i]<<std::endl; return 0; }
[SDOI2009]HH的项链
最新推荐文章于 2022-07-17 07:04:19 发布