题目https://www.luogu.org/problemnew/show/P1972

题意:给定一个长度为n的序列,数字表示珠子的种类。m次查询每次询问给定区间内珠子的种类数。

思路:可以说是运用了前缀和的思想吧。从前到后的去处理查询,而对于某一个查询区间,如果某一个种类出现了多次的话我们只需要计算最后一次出现。

用query(x)表示1~x区间内的种类数,其中对每个种类我们只标记最后一次出现。也就是说顺序遍历的时候如果又出现了就把前面的清空,标记当前位置。

如果查询的区间是l~r那么答案就是query(r) - query(l - 1)。

所以首先需要把查询按照右端点从小到大排序。每次只需要更新上一次右端点到这一次右端点这一段区间,同时要标记每一个种类最近一次出现的位置,用于清空。

 #include<cstdio>
#include<cstdlib>
#include<map>
#include<set>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
#include<stack>
#include<queue>
#include<iostream> #define inf 0x3f3f3f3f
using namespace std;
typedef long long LL;
typedef pair<int, int> pr; int n, m;
const int maxn = 5e5 + ;
struct node{
int l, r, id, ans;
}q[maxn];
int neck[maxn];
int sum[maxn << ];
const int maxnum = 1e6 + ;
int pos[maxnum]; bool cmp(node a, node b)
{
return a.r < b.r;
} bool cmp1(node a, node b)
{
return a.id < b.id;
} void add(int rt, int val)
{
while(rt <= n){
sum[rt] += val;
rt += (rt & -rt);
}
} int query(int rt)
{
int ans = ;
while(rt){
ans += sum[rt];
rt -= (rt & -rt);
}
return ans;
} int main()
{
scanf("%d", &n);
for(int i = ; i <= n; i++){
scanf("%d", &neck[i]);
}
scanf("%d", &m);
for(int i = ; i < m; i++){
scanf("%d%d", &q[i].l, &q[i].r);
q[i].id = i;
}
sort(q, q + m, cmp); int nxt = ;
for(int i = ; i < m; i++){
int r = q[i].r;
for(int j = nxt; j <= r; j++){
if(pos[neck[j]]){
add(pos[neck[j]], -);
}
add(j, );
pos[neck[j]] = j;
}
nxt = r + ;
q[i].ans = query(q[i].r) - query(q[i].l - );
}
sort(q, q + m, cmp1);
for(int i = ; i < m; i++){
printf("%d\n", q[i].ans);
}
return ;
}

最新文章

  1. bzoj 1031 [JSOI2007]字符加密Cipher
  2. windows内核 内存管理
  3. 深入浅出ES6(十一):生成器 Generators,续篇
  4. eclipse 恢复被删除的文件
  5. HDU 1787 GCD Again(欧拉函数,水题)
  6. 【ASP.NET Web API教程】3.4 HttpClient消息处理器
  7. asp.net &lt;% = #区别
  8. 凯撒密码加密解密--JAVA实现(基础)
  9. P1577 切绳子
  10. 使用STS创建springboot项目pom.xml文件报错org.apache.maven.archiver.MavenArchiver.getManifest
  11. [Docker] 容器持久化数据的首选机制 Volume
  12. js运用4
  13. spring-batch批处理框架
  14. 源码分享篇:使用Python进行QQ批量登录
  15. 在Visual Studio代码中使用Flask
  16. IIS6.0发布后对路径“D:\xxx\xxxx\web.config”的访问被拒绝问题的解决方法
  17. conductor Workflow Metrics
  18. loj#2718. 「NOI2018」归程
  19. matlab 投影
  20. Python学习系列(五)(文件操作及其字典)

热门文章

  1. Ubuntu12.10添加matlab启动器
  2. 6.66 分钟,一文Python爬虫解疑大全教入门!
  3. python 之 前端开发( DOM操作)
  4. ~ubuntu1804安装禅道
  5. MAC帧封装
  6. Oracle 11g xe版本---总结1
  7. docker 启动 容器----bootstrap checks failed
  8. Java开发Hbase示例
  9. 将netcore网站部署到docker容器中
  10. POJ3368(Frequent values)--线段树