ACM训练日记
来源:互联网 发布:下载无人机航拍软件, 编辑:程序博客网 时间:2024/06/06 17:40
这两天继续看了树状数组和线段树,今天晚上做了一个新的专题的题目,是关于树状数组离线处理的
查询给定区间的不同数的个数,
可以记录每一个位置上的点上一次出现的位置,然后把操作安右区间升序,从头开始,每一次将上一个点到当前点的区间部分加一,查询操作区间的右端点的前缀和就可以了
#include<iostream>
#include<string.h>
#include<stdio.h>
#include<algorithm>
using namespace std;
#define MAX 50005
int e[MAX],hash[1000005],last[1000005],ans[200005];
struct node
{
int l,r,num;
}b[1000005];
bool cmp(node a,node b)
{
return a.r<b.r;
}
int lowbit(int k)
{
return k&(-k);
}
void ADD(int k,int v)
{
while(k<MAX)
{
e[k]+=v;
k+=lowbit(k);
}
}
long long SUM(int k)
{
long long re=0;
while(k)
{
re+=e[k];
k-=lowbit(k);
}
return re;
}
int main()
{
int N,M;
while(~scanf("%d",&N))
{
for(int i=1;i<=N;i++)
{
int A;
scanf("%d",&A);
hash[i]=last[A]+1;
last[A]=i;
}
scanf("%d",&M);
for(int i=1;i<=M;i++)
{
scanf("%d%d",&b[i].l,&b[i].r);
b[i].num=i;
}
sort(b+1,b+1+M,cmp);
int now=1;
for(int i=1;i<=M;i++)
{
while(now<=b[i].r)
{
now++;
ADD(hash[now-1],1);
ADD(now,-1);
}
ans[b[i].num]=SUM(b[i].l);
}
for(int i=1;i<=M;i++)
printf("%d\n",ans[i]);
}
}
- ACM训练日记
- ACM暑假训练日记 17.8.12
- ACM暑假训练日记 17.8.19
- ACM暑假训练日记 17.8.21
- ACM暑假训练日记 17.8.22
- ACM训练日记—8月2日
- ACM训练日记—8月3日
- ACM训练日记—8月4日
- ACM训练日记—8月5日
- ACM训练日记—8月7日
- ACM训练日记—8月8日
- ACM训练日记—8月9日
- ACM训练日记—8月10日
- ACM训练日记—8月11日
- ACM训练日记—8月12日
- ACM训练日记—8月14日
- ACM训练日记—8月15日
- ACM训练日记—8月16日
- 用户、角色、权限表的关系(mysql)
- Seetaface 02 Seetaface AndroidStudio Demo
- Linux之 linux7防火墙基本使用及详解
- 个人知识体系
- 【证明】卡特兰数(折线法)
- ACM训练日记
- 基础知识面试,看看你的基础都忘了没?
- background-image和img的区别
- 【分析】Ceph and RBD Mirroring:Luminous
- [BZOJ]1930: [Shoi2003]pacman 吃豆豆 费用流
- [爬虫] Python爬虫技巧
- Java Web 内置对象实例解析
- C语言实验——输出字符串
- javascript中break和continue