这道题想了很久,发题解是为了理解的更深刻一点。。。(管理放我过好嘛qwq)


步入正题:这道题应该是很多做法,我选择的是离线+树状数组。

首先输入数组。用fisrt数组先记录元素最开始出现的位置,对应的每一个树状数组的位置add一下(树状数组洛谷也有模板题的了解一下就ok啦)。

rep(i,1,n){//for循环的意思(1,n)闭区间
scanf("%d",&a[i]);
if(!first[a[i]]){
first[a[i]]=i;
add(i);//若第一次出现 则在树状数组中add。
}
}

然后倒着更新一遍数组,对每个元素用last数组记录当前下标元素的下一个出现的位置(可以模拟一遍就理解了)

per(i,n,1){//还是for循环(n,1)
last[i]=first[a[i]];
first[a[i]]=i;//last数组记录当前元素 下一次出现的位置。
}

接下来就是存一下询问啦。用vector存结构体应该快一点,结构体用左端点为关键字进行sort排序。

    struct uzi{//全局的结构体,id为询问的序号
int x,y,id;
bool operator <(const uzi &a)const{
return x<a.x;
}
}; vector<uzi> val;
rep(i,0,m-1){
int x,y;
scanf("%d%d",&x,&y);
val.push_back(uzi{x,y,i});//将询问存入
}
sort(val.begin(),val.end());//排序

接下来就是询问的处理啦(jd)

因为已经按左端点排序好了,所以 直接对树状数组动态更新,然后记录答案。这里用了一个j。当j比左端点小,就在j下标元素下个出现的位置对树状数组更新。(add)。。然后记录询问的结果就好啦。。。

for(auto k:val){
while(j<k.x){
add(last[j]);
j++;
}
ans[k.id]=sum(k.y)-sum(k.x-1);
}

然后直接输出每个询问的结果就做完啦。。。。。

贴下全部的代码


#include<bits/stdc++.h>
#define swap(a,b) {a^=b;b^=a;a^=b}
#define rep(a,b,c) for(int a=b;a<=c;a++)
#define per(i,n,a) for (int i=n;i>=a;i--)
#define max(a,b) (a)>(b)?(a):(b)
#define min(a,b) (a)<(b)?(a):(b)
#define PII pair<int,int>
#define yxdl(qt) priority_queue<int,vector<int>,greater<int> >qt
#define xgd(qt) priority_queue<int,vector<int>,less<int> >qt
#define INF 0x3f3f3f3f
#define lowbit(x) x & -x
#define cs(s) freopen(s,"r",stdin)
#define debug(x) printf(" case-->%d ",x );
using namespace std;
typedef long long ll;
int a[500010],tree[500011],first[5000101],last[5100001],n,m,ans[510001];
struct uzi{
int x,y,id;
bool operator <(const uzi &a)const{
return x<a.x;
}
};
inline void add(int x){for(int i=x;i<=n;i+=lowbit(i))tree[i]+=1;}
inline int sum (int x){int ans=0;for(int i=x;i;i-=lowbit(i))ans+=tree[i];return ans;}
int main(){
scanf("%d",&n);
rep(i,1,n){
scanf("%d",&a[i]);
if(!first[a[i]]){
first[a[i]]=i;
add(i);//若第一次出现 则在树状数组中add。
}
}
per(i,n,1){
last[i]=first[a[i]];
first[a[i]]=i;//last数组记录当前元素 下一次出现的位置。
}
scanf("%d",&m);
vector<uzi> val;
rep(i,0,m-1){
int x,y;
scanf("%d%d",&x,&y);
val.push_back(uzi{x,y,i});//将询问存入
}
int j=1;
sort(val.begin(),val.end());//排序
for(auto k:val){
while(j<k.x){
add(last[j]);
j++;
}
ans[k.id]=sum(k.y)-sum(k.x-1);
}
rep(i,0,m-1){
printf("%d\n",ans[i] );
}
}

洛谷P1972 【[SDOI2009]HH的项链】的更多相关文章

  1. 洛谷 P1972 [SDOI2009]HH的项链【莫队算法学习】

    P1972 [SDOI2009]HH的项链 题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含 ...

  2. 洛谷 P1972 [SDOI2009]HH的项链 解题报告

    P1972 [SDOI2009]HH的项链 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断 ...

  3. 洛谷——P1972 [SDOI2009]HH的项链(线段树)

    P1972 [SDOI2009]HH的项链 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的 ...

  4. 洛谷 P1972 [SDOI2009]HH的项链-二维偏序+树状数组+读入挂(离线处理,思维,直接1~n一边插入一边查询),hahahahahahaha~

    P1972 [SDOI2009]HH的项链 题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含 ...

  5. 洛谷P1972 [SDOI2009]HH的项链 题解

    [SDOI2009]HH的项链 题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不 ...

  6. [洛谷P1972][SDOI2009]HH的项链

    题目大意:给你一串数字,多次询问区间内数字的种类数 题解:莫队 卡点:洛谷数据加强,开了个$O(2)$ C++ Code: #include <cstdio> #include <a ...

  7. 洛谷P1972 [SDOI2009]HH的项链(树状数组)

    题目链接: https://www.luogu.org/problemnew/show/P1972 题目描述: HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后 ...

  8. 洛谷 P1972 [SDOI2009]HH的项链——树状数组

    先上一波题目 https://www.luogu.org/problem/P1972 这道题是询问区间内不同数的个数 明显不是正常的数据结构能够维护的 首先考虑 因为对于若干个询问的区间[l,r],如 ...

  9. 洛谷 P1972 [SDOI2009]HH的项链

    不是裸题,鉴定完毕. 我是题面 对于这道题,我是离线做的... 树状数组吧,好些点 我们可以很轻易地得到一个很显然的结论,就是关于同一个数,我们只需要记录它不超过当前区间的最后一次出现的位置即可.举例 ...

  10. 洛谷 P1972 [SDOI2009]HH的项链(树状数组,离线)

    传送门 解题思路 因为是求区间的不同种类数,所以我们用树状数组(貌似并没有什么直接联系) (...表示到) 还是和原来一样,用s[i]来表示a[i-lowbit(i)]...a[i]的种类数. 因为有 ...

随机推荐

  1. A1138. Postorder Traversal

    Suppose that all the keys in a binary tree are distinct positive integers. Given the preorder and in ...

  2. Jquery Mobile列表

    向 <ol> 或 <ul> 元素添加 data-role="listview" 1.圆角和外边距 :data-inset="true" ...

  3. Linux系统centos6.7上安装libevent

    1 下载地址:http://libevent.org/ 2.解压 tar zxvf libevent-2.0.21-stable.tar.gz 安装前请先安装 gcc yum install gcc ...

  4. springboot学习笔记-5 springboot整合shiro

    shiro是一个权限框架,具体的使用可以查看其官网 http://shiro.apache.org/  它提供了很方便的权限认证和登录的功能. 而springboot作为一个开源框架,必然提供了和sh ...

  5. 16、计算1加到100用两个定义值count=1、sum=0

    #!/user/bin/python# -*- coding:utf-8 -*-count = 1sum = 0while count <= 100: sum = sum + count cou ...

  6. Kafka Offset相关命令总结

    Kafka Offset相关命令总结 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查询topic的offset的范围 1>.查询某个topic的offset的最小值 [ ...

  7. entityManager分页

    十分操蛋. 需要两步. 第一步,查询一共需要多少条. 第二步   分页得到数据 Query query = this.entityManager.createNativeQuery(sb2.toStr ...

  8. springMVC的参数检验

    先说应用场景,比如说前台传来一个参数,我们肯定得在后台判断一下,比如id不能为空了,电话号码不能少于11位了等等.如果在service层一个一个判断岂不是要累死个人.代码也不简洁,这时候我们肯定会想到 ...

  9. lasticsearch最佳实践之分片使用优化

    一.遇到的问题 与大多数分布式系统一样,Elasticsearch按照一定的Hash规则把用户数据切分成多个分片,然后打散到不同机器进行存储,从而实现大规模数据的分布式存储. cluster.png ...

  10. webservice 项目中遇到的问题

    redshift database 连接异常 解决方案 url 修改添加参数如下 jdbc:redshift://hostname:5439/dbname?ssl=true&sslfactor ...