http://acm.hdu.edu.cn/showproblem.php?pid=3333

不错的题,想了非常久不知道怎么处理,并且答案没看懂,然后找个样例模拟下别人的代码立即懂了---以后看不懂的话就拿个样例模拟下别人的代码

举个样例:1 3 3 5 3 5

查询

a, 2 4

b, 2 5

最初是这么想的:对于a查询,倘若把第二个数第三个数变成1个3。那么到b查询,又出现了两个3,再做处理似乎还是O(n),并且假设先出现2,5查询,后出现2,4查询。那么还须要把删除的数补回来.....o(╯□╰)o,然后就陷入迷茫啊.......

题解:

1、把查询按区间右端点由小到大排列,就避免了“须要把删除的数补回来”,如上面的样例,a查询的时候删除的3,在b查询的时候仍须要删除,可是假设先b查询后a查询。b查询须要删除第二个数第三个数。a查询须要把第三个数补回来....

2、每查询到一个区间。确保以右端点为结束为止的前缀没有反复的数

详细看代码-----拿样例模拟下,。回头我一定重写一遍

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <iostream>
#include <cmath>
#include <map>
#include <set>
#include <queue>
using namespace std; #define ls(rt) rt*2
#define rs(rt) rt*2+1
#define ll long long
#define ull unsigned long long
#define rep(i,s,e) for(int i=s;i<e;i++)
#define repe(i,s,e) for(int i=s;i<=e;i++)
#define CL(a,b) memset(a,b,sizeof(a))
#define IN(s) freopen(s,"r",stdin)
#define OUT(s) freopen(s,"w",stdout) const int MAXN = 50000+100;
struct Query
{
int l,r;
int id;
bool operator < (const Query &c)const
{
return r<c.r;
}
}q[100000 + 100]; ll c[MAXN],ans[100000 + 100];
ll num[MAXN],bi[MAXN];
int last[MAXN];
int N; inline int lowbit(int i){return i&(-i);} void add(int x, int v)
{
while(x<=N)
{
c[x]+=v;
x+=lowbit(x);
}
}
ll sum(int i)
{
ll ret=0;
while(i>0)
{
ret+=c[i];
i-=lowbit(i);
}
return ret;
} int main()
{
//IN("hdu3333.txt");
int ncase,Q;
scanf("%d",&ncase);
while(ncase--)
{
CL(c,0);CL(last,0);
scanf("%d",&N);
for(int i=1;i<=N;i++)
{
scanf("%I64d",&num[i]);
bi[i]=num[i];
} scanf("%d",&Q);
for(int i=1;i<=Q;i++)
{
scanf("%d%d",&q[i].l,&q[i].r);
q[i].id=i;
}
sort(q+1,q+1+Q);
sort(bi+1,bi+1+N);
int qu=1;
for(int i=1;i<=N;i++)
{
int pos=lower_bound(bi+1,bi+1+N,num[i])-bi;
if(!last[pos])
{
add(i,num[i]);
last[pos]=i;
}
else
{
add(last[pos],-num[i]);
add(i,num[i]);
last[pos]=i;
}
while(q[qu].r == i && qu<=Q)
{
ans[q[qu].id]=sum(i)-sum(q[qu].l-1);
qu++;
}
}
for(int i=1;i<=Q;i++)
printf("%I64d\n",ans[i]);
}
return 0;
}

hdu 3333 树状数组+离线处理的更多相关文章

  1. HDU 3333 树状数组离线查询

    题目大意: 询问区间内不同种类的数的数值之和 这里逐个添加最后在线查询,会因为相同的数在区间内导致冲突 我们总是希望之后添加的数不会影响前面,那么我们就在添加到第i个数的时候,把所有在1~i 的区间的 ...

  2. hdu 3333(树状数组 + 离线操作)

    Turing Tree Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  3. Turing Tree HDU - 3333 (树状数组,离线求区间元素种类数)

    After inventing Turing Tree, 3xian always felt boring when solving problems about intervals, because ...

  4. hdu 3333 树状数组

    思路:定义一个map容器用来记录数ai上次出现的位置.将查询区间按右边界升序进行排序,当插入第i个数ai时,pre[ai]+1---->i的区间就会多一个不同的数,其值就是ai,那么可以用upd ...

  5. Necklace HDU - 3874 (线段树/树状数组 + 离线处理)

    Necklace HDU - 3874  Mery has a beautiful necklace. The necklace is made up of N magic balls. Each b ...

  6. 2016 Multi-University Training Contest 5 1012 World is Exploding 树状数组+离线化

    http://acm.hdu.edu.cn/showproblem.php?pid=5792 1012 World is Exploding 题意:选四个数,满足a<b and A[a]< ...

  7. hdu 4638 树状数组 区间内连续区间的个数(尽可能长)

    Group Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  8. hdu 4777 树状数组+合数分解

    Rabbit Kingdom Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  9. SPOJ DQUERY树状数组离线or主席树

    D-query Time Limit: 227MS   Memory Limit: 1572864KB   64bit IO Format: %lld & %llu Submit Status ...

随机推荐

  1. 关于Oralce数据库优化的几点总结

    个人理解,数据库性能最关键的因素在于IO,因为操作内存是快速的,但是读写磁盘是速度很慢的,优化数据库最关键的问题在于减少磁盘的IO,就个人理解应该分为物理的和逻辑的优化, 物理的是指oracle产品本 ...

  2. C#使用Redis集群缓存

    C#使用Redis集群缓存 本文介绍系统缓存组件,采用NOSQL之Redis作为系统缓存层. 一.背景 系统考虑到高并发的使用场景.对于并发提交场景,通过上一章节介绍的RabbitMQ组件解决.对于系 ...

  3. Git使用之搭建基于SSH的Gitserver(上篇)

    1. 须要软件 msysgit (Gitfor Windows) Copssh (OpenSSHfor Windows,新版本号已经開始收费了大家能够去搜索引擎找曾经的免费版Copssh_4.1.0下 ...

  4. iOS安全攻击和防御(24):敏感的保护方案逻辑(1)

    iOS安全攻击和防御(24):敏感的保护方案逻辑(1) Objective-C代码easy被hook.暴露信息太赤裸裸,为了安全,改用C来写吧! 当然不是所有代码都要C来写,我指的是敏感业务逻辑代码. ...

  5. C++--allocator类的使用

    C++为我们提供了安全的内存空间申请方式与释放方式,可是new与delete表达式却是把空间的分配回收与对象的构建销毁紧紧的关联在一起.实际上,作为与C语言兼容的语言,C++也为我们提供了更加底层的内 ...

  6. hdu1394(线段树求逆序对)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 线段树功能:update:单点增减 query:区间求和 分析:如果是0到n-1的排列,那么如果 ...

  7. urses.ascii.ispunct(ch):

    Nullege: A Search Engine for Python source code urses.ascii.ispunct(ch): TypeError: 'unicode' object ...

  8. Javascript语言精粹之Array常用方法分析

    Javascript语言精粹之Array常用方法分析 1.Array常用方法分析 1.1 Array.prototype.sort() Javascript的默认比较函数假定被排序元素都是字符串,所以 ...

  9. 基于VLC的视频播放器

    原文:基于VLC的视频播放器 最近在研究视频播放的功能,之前是使用VideoView.在网上看了一下,感觉不是很好,支持的格式比较少,现在网络视频的格式各种各样,感觉用VideoView播放起来局限性 ...

  10. HiPAC高性能规则匹配算法之查找过程

    收到一封邮件,有位朋友认为我误解了nf-HiPAC.如此的一个高性能算法怎能被什么传统的hash,tree之类的胁迫.是啊.HiPAC是一个非常猛的算法.文档也比較少,这就更加添加了其神奇感,可是这决 ...