hdu 3333 树状数组+离线处理
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 树状数组+离线处理的更多相关文章
- HDU 3333 树状数组离线查询
题目大意: 询问区间内不同种类的数的数值之和 这里逐个添加最后在线查询,会因为相同的数在区间内导致冲突 我们总是希望之后添加的数不会影响前面,那么我们就在添加到第i个数的时候,把所有在1~i 的区间的 ...
- hdu 3333(树状数组 + 离线操作)
Turing Tree Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- Turing Tree HDU - 3333 (树状数组,离线求区间元素种类数)
After inventing Turing Tree, 3xian always felt boring when solving problems about intervals, because ...
- hdu 3333 树状数组
思路:定义一个map容器用来记录数ai上次出现的位置.将查询区间按右边界升序进行排序,当插入第i个数ai时,pre[ai]+1---->i的区间就会多一个不同的数,其值就是ai,那么可以用upd ...
- Necklace HDU - 3874 (线段树/树状数组 + 离线处理)
Necklace HDU - 3874 Mery has a beautiful necklace. The necklace is made up of N magic balls. Each b ...
- 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]< ...
- hdu 4638 树状数组 区间内连续区间的个数(尽可能长)
Group Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- hdu 4777 树状数组+合数分解
Rabbit Kingdom Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- SPOJ DQUERY树状数组离线or主席树
D-query Time Limit: 227MS Memory Limit: 1572864KB 64bit IO Format: %lld & %llu Submit Status ...
随机推荐
- POJ 3414 Pots 记录路径的广搜
Description You are given two pots, having the volume of A and B liters respectively. The following ...
- HDU 3488Tour(流的最小费用网络流)
职务地址:hdu3488 这题跟上题基本差点儿相同啊... . 详情请戳这里. 另外我认为有要改变下代码风格了..最终知道了为什么大牛们的代码的变量名都命名的那么长..我决定还是把源点与汇点改成sou ...
- Beijing seminar: China shadow banking
Beijing seminar: China shadow banking-张化桥-财新博客-新世纪的常识传播者-财新网 Beijing seminar: China shadow banking
- SE 2014年4月25日
1. 描述 STP 的计算过程 (1.根桥的选举 2.端口角色的确定) 根桥的选举 启用STP后,网络中桥ID最小的交换机会被选为根桥,桥ID由桥优先级和桥MAC两部分组成,优先级默认为32768,首 ...
- c/c++中main函数参数讲解
参考地址: http://blog.csdn.net/cnctloveyu/article/details/3905720 我们经常用的main函数都是不带参数的.因此main 后的括号都是空括号.实 ...
- 采用Bash脚本性能监控过程
为一个Linux过程监控,采用Bash脚本. 采用ps命令的过程监控,使用周期加上连续监测的睡眠时间. 使用方法: psmonitor.sh -p [pid] -d [interval] -n [st ...
- Android的目录结构说明
- viewpager与子view的事件冲突解决
问题: 对android的事件机制一直不怎么了解,最近android项目中运用viewpager+listview (就是viewpager的子view中嵌套了listview),出现了触摸手势冲突 ...
- JDBC连接数据库经验技巧(转)
Java数据库连接(JDBC)由一组用 Java 编程语言编写的类和接口组成.JDBC 为工具/数据库开发人员提供了一个标准的 API,使他们能够用纯Java API 来编写数据库应用程序.然而各个开 ...
- android选择和裁剪图像拍摄的图像
转载请注明出处:http://blog.csdn.net/allen315410/article/details/39994913 近期从曾经的项目中扒下来一个经常使用的模块.在这里有必要记录一下的. ...