洛谷P1972 【[SDOI2009]HH的项链】
这道题想了很久,发题解是为了理解的更深刻一点。。。(管理放我过好嘛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的项链】的更多相关文章
- 洛谷 P1972 [SDOI2009]HH的项链【莫队算法学习】
P1972 [SDOI2009]HH的项链 题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含 ...
- 洛谷 P1972 [SDOI2009]HH的项链 解题报告
P1972 [SDOI2009]HH的项链 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断 ...
- 洛谷——P1972 [SDOI2009]HH的项链(线段树)
P1972 [SDOI2009]HH的项链 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的 ...
- 洛谷 P1972 [SDOI2009]HH的项链-二维偏序+树状数组+读入挂(离线处理,思维,直接1~n一边插入一边查询),hahahahahahaha~
P1972 [SDOI2009]HH的项链 题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含 ...
- 洛谷P1972 [SDOI2009]HH的项链 题解
[SDOI2009]HH的项链 题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不 ...
- [洛谷P1972][SDOI2009]HH的项链
题目大意:给你一串数字,多次询问区间内数字的种类数 题解:莫队 卡点:洛谷数据加强,开了个$O(2)$ C++ Code: #include <cstdio> #include <a ...
- 洛谷P1972 [SDOI2009]HH的项链(树状数组)
题目链接: https://www.luogu.org/problemnew/show/P1972 题目描述: HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后 ...
- 洛谷 P1972 [SDOI2009]HH的项链——树状数组
先上一波题目 https://www.luogu.org/problem/P1972 这道题是询问区间内不同数的个数 明显不是正常的数据结构能够维护的 首先考虑 因为对于若干个询问的区间[l,r],如 ...
- 洛谷 P1972 [SDOI2009]HH的项链
不是裸题,鉴定完毕. 我是题面 对于这道题,我是离线做的... 树状数组吧,好些点 我们可以很轻易地得到一个很显然的结论,就是关于同一个数,我们只需要记录它不超过当前区间的最后一次出现的位置即可.举例 ...
- 洛谷 P1972 [SDOI2009]HH的项链(树状数组,离线)
传送门 解题思路 因为是求区间的不同种类数,所以我们用树状数组(貌似并没有什么直接联系) (...表示到) 还是和原来一样,用s[i]来表示a[i-lowbit(i)]...a[i]的种类数. 因为有 ...
随机推荐
- A1138. Postorder Traversal
Suppose that all the keys in a binary tree are distinct positive integers. Given the preorder and in ...
- Jquery Mobile列表
向 <ol> 或 <ul> 元素添加 data-role="listview" 1.圆角和外边距 :data-inset="true" ...
- Linux系统centos6.7上安装libevent
1 下载地址:http://libevent.org/ 2.解压 tar zxvf libevent-2.0.21-stable.tar.gz 安装前请先安装 gcc yum install gcc ...
- springboot学习笔记-5 springboot整合shiro
shiro是一个权限框架,具体的使用可以查看其官网 http://shiro.apache.org/ 它提供了很方便的权限认证和登录的功能. 而springboot作为一个开源框架,必然提供了和sh ...
- 16、计算1加到100用两个定义值count=1、sum=0
#!/user/bin/python# -*- coding:utf-8 -*-count = 1sum = 0while count <= 100: sum = sum + count cou ...
- Kafka Offset相关命令总结
Kafka Offset相关命令总结 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查询topic的offset的范围 1>.查询某个topic的offset的最小值 [ ...
- entityManager分页
十分操蛋. 需要两步. 第一步,查询一共需要多少条. 第二步 分页得到数据 Query query = this.entityManager.createNativeQuery(sb2.toStr ...
- springMVC的参数检验
先说应用场景,比如说前台传来一个参数,我们肯定得在后台判断一下,比如id不能为空了,电话号码不能少于11位了等等.如果在service层一个一个判断岂不是要累死个人.代码也不简洁,这时候我们肯定会想到 ...
- lasticsearch最佳实践之分片使用优化
一.遇到的问题 与大多数分布式系统一样,Elasticsearch按照一定的Hash规则把用户数据切分成多个分片,然后打散到不同机器进行存储,从而实现大规模数据的分布式存储. cluster.png ...
- webservice 项目中遇到的问题
redshift database 连接异常 解决方案 url 修改添加参数如下 jdbc:redshift://hostname:5439/dbname?ssl=true&sslfactor ...