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. 10105 - Polynomial Coefficients

    描述:杨辉三角与二项式定理 #include <cstdio> int solve(int n,int m) { int sum=1; for(int i=n; i>m; --i) ...

  2. POJ2112_Optimal Milking(网洛流最大流Dinic+最短路Flody+二分)

    解题报告 农场有k个挤奶机和c头牛,每头牛到每一台挤奶机距离不一样,每台挤奶机每天最多挤m头牛的奶. 寻找一个方案,安排每头牛到某一挤奶机挤奶,使得c头牛须要走的全部路程中的最大路程的最小值. 要使每 ...

  3. CentOS Kernel Source Install

    http://linuxmoz.com/centos-kernel-source-install/

  4. hdu3001(状压dp)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3001 题意:n 个城市已经 m 条路 以及对应路费 c,要求遍历所有城市最少的路费,每个城市不能超过2 ...

  5. poj3126(bfs)

    题目链接:http://poj.org/problem?id=3126 题意:给两个四位数n,m,将n变成m需要多少步,要求每次只能改变n的某一位数,即改变后的数与改变前的数只有一位不同,且每次改变后 ...

  6. BaiduMap_SDK_DEMO_3.0.0_for_Xamarin.Android_by_imknown

    2.4.2 已稳定, 同一时候已经放置到分支/Release 2.4.2了. 3.0.0 已开发完毕, 可是不推荐大家用于项目中, 请观望或者自己进一步调试. 个人感觉尽管3.0.0简化了开发, 可是 ...

  7. 使用AndroidFrameworks开发和应用隐藏类 or Android使用自定义framework开发与应用

    Android眼下代表系统的开源手机操作系统已经更新到4.0.3版本号.由于其开源特性.使得操作系统本身所具有的最大的灵活性,但同时也引起的版本号的多样性,市场上出现的是手机厂商或ROM.可是怎样开发 ...

  8. Struts2 学习第一步准备工作

    第一步:安装下载MyEclispe10 对于MyEclispe的下载安装就不再详述了. 第二步:下载Struts-2.3.15 Struts-2.3.15下载地址: http://struts.apa ...

  9. xcode中找不到XXX.dylib

    xcode中找不到 XXX.dylib 了,比如libz.tbd 如果要用到 libz.dylib,可以用下面的办法,来自 Stack Overflow. Go to Build Phases > ...

  10. 在Windows下使用Hexo+GithubPage搭建博客的过程

    1.安装Node.js 下载地址:传送门 去 node.js 官网下载相应版本,进行安装即可. 可以通过node -v的命令来测试NodeJS是否安装成功 2.安装Git 下载地址:传送门 去 Git ...