SPOJ3267--D-query (树状数组离线操作)
题意查询区间 [l,r]内有多少个不同的数字
先把所有询问按 右端点进行排序,然后离线操作。如果该位置的数字 已经出现过那么把前一个位置-1,当前位置+1。扫一遍输出。
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std; const int maxq = 2e5+;
const int maxn = 3e4+;
int last[];
int n,m,c[maxn],ans[];
struct Node
{
int l,r,ans,idx;
bool operator < (const Node &rhs)const
{
return r < rhs.r || (r == rhs.r && l < rhs.l);
}
}Q[maxq];
int lowbit(int x)
{
return x & -x;
}
void add(int x,int d)
{
while (x <= maxn)
{
c[x] += d;
x += lowbit(x);
}
}
int sum(int x)
{
int ans = ;
while (x)
{
ans += c[x];
x -= lowbit(x);
}
return ans;
}
int a[maxq];
int main(void)
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
while (~scanf ("%d",&n))
{
memset(c,,sizeof(c));
memset(last,-,sizeof(last));
for (int i = ; i <= n+; i++)
scanf ("%d",a+i);
scanf ("%d",&m);
for (int i = ; i < m; i++)
{
Q[i].idx = i;
scanf ("%d%d",&Q[i].l,&Q[i].r);
Q[i].l++,Q[i].r++;
}
sort(Q,Q+m);
int pre = ;
for (int i = ; i < m; i++)
{
for(int j = pre; j <= Q[i].r; j++)
{
if (~last[a[j]])
{
add(last[a[j]],-);
add(j,);
}
else
{
add(j,);
}
last[a[j]] = j;
}
ans[Q[i].idx] = sum(Q[i].r) - sum(Q[i].l - );
pre = Q[i].r+;
}
for (int i = ; i < m; i++)
printf("%d\n",ans[i]);
}
return ;
}
此题主席树也可以做。
SPOJ3267--D-query (树状数组离线操作)的更多相关文章
- HDU3874Necklace(树状数组+离线操作)
此题的大意思说有一串珠子,每个珠子都有自己的欣赏值value,现在给你一串珠子每个的欣赏值,并给出一些询问,查询某个区间内部总欣赏值是多少,但是有一个约定就是如果这个区间内部有两个珠子的欣赏值是一样的 ...
- HDU 5869 Different GCD Subarray Query 树状数组+离线
Problem Description This is a simple problem. The teacher gives Bob a list of problems about GCD (Gr ...
- HDU---4417Super Mario 树状数组 离线操作
题意:给定 n个数,查询 位置L R内 小于x的数有多少个. 对于某一次查询 把所有比x小的数 ”的位置“ 都加入到树状数组中,然后sum(R)-sum(L-1)就是答案,q次查询就要离线操作了,按高 ...
- HDU 5869 Different GCD Subarray Query 树状数组 + 一些数学背景
http://acm.hdu.edu.cn/showproblem.php?pid=5869 题意:给定一个数组,然后给出若干个询问,询问[L, R]中,有多少个子数组的gcd是不同的. 就是[L, ...
- hdu 3333(树状数组 + 离线操作)
Turing Tree Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU 4630 No Pain No Game 树状数组+离线操作
题意:给一串数字,每次查询[L,R]中两个数的gcd的最大值. 解法:容易知道,要使取两个数让gcd最大,这两个数最好是倍数关系,所以处理出每个数的所有倍数,两两间根据倍数关系形成一条线段,值为该数. ...
- Codeforces 369E Valera and Queries --树状数组+离线操作
题意:给一些线段,然后给m个查询,每次查询都给出一些点,问有多少条线段包含这个点集中的一个或多个点 解法:直接离线以点为基准和以线段为基准都不好处理,“正难则反”,我们试着求有多少线段是不包含某个查询 ...
- bzoj 1878 SDOI2009树状数组 离线操作
本来想写2120的,结果想起来了这个 我们先对于询问左端点排序,用树状数组存区间字母个数,对于每种字母, 第一次出现的位置记录为1,剩下的记录为0,然后记录下,每种颜色 后面第一个和他相同颜色的位置 ...
- SPOJ3267 D-query 离线+树状数组 在线主席树
分析:这个题,离线的话就是水题,如果强制在线,其实和离线一个思路,然后硬上主席树就行了 离线的代码 #include <iostream> #include <stdio.h> ...
随机推荐
- struts2处理请求流程详解
struts2大概分为两块:一是struts2系统初始化,二是struts2处理请求,对请求作出响应. 下面就说说个人对struts2对请求处理流程的理解: 下面是StrutsPrepareAndEx ...
- logcat使用
做android有些日子了,只是对主要的logcat的具体使用方法还是非常模糊,今天有空,学习一下. logcat能够在adb中使用,也能够直接在命令行下使用. logcat [options] [f ...
- Tomcat jdbc pool配置
Tomcat jdbc pool是apache在tomcat7版本中启用的新连接池,用它来解决以往DBCP无法解决的一些问题. Tomcat jdbc pool的优点: (1) tomcat j ...
- Environment Configuration Files
Environment Configuration Files When a user logs in, an environment is created for that user automat ...
- CentOS 7 安装教程
参考资料: http://www.cnblogs.com/bobbylinux/articles/centos7.html
- mockito学习
mockito学习 写一个测试用例,如果在测试类上面添加了注解@RunWith(SpringJUnit4ClassRunner.class),必须添加@ContextConfiguration(&qu ...
- Android 聊天气泡
网上搜到的只有一篇是自定义的TextView,其使用比较麻烦,所以采用大众化的方法--使用9.png来实现. 这里主要介绍sdk tool的draw9patch.bat的使用. 这个bat执行文件打开 ...
- android获取在res文件下的图片资源
//得到该图片的id(name 是该图片的名字,"drawable" 是该图片存放的目录,getPackageName()是应用程序的包) int resID = getResou ...
- VS2013默认快捷键
目录: Global 分析 调试器上下文菜单 体系结构 调试器上下文菜单 生成 诊断中心 类视图上下文菜单 Edit 调试 编辑器上下文菜单 文件 项目和解决方案上下文菜单 帮助 重构 负载测试 解决 ...
- String在JAVA里是固定长度的吗?为什么可用“+”连接
所谓长度固定不是你理解的意思而是说String类中存储的char[]是final的,不能修改,你对String的操作实际上是产生了一个新的String,对于某一个String来说,长度就是固定的了 S ...