题意:给一个数组,每次查询输出区间内不重复数字的和。

这是3xian教主的题。

用前缀和的思想可以轻易求得区间的和,但是对于重复数字这点很难处理。在线很难下手,考虑离线处理。

将所有查询区间从右端点由小到大排序,遍历数组中的每个数字,每次将该数字上次出现位置的值在树状数组中改为0,再记录当前位置,在树状数组中修改为当前的数值。这样可以保证在接下来的查询中该数字只出现了一次。这是贪心的思想,只保留最可能被以后区间查询的位置。如果当前位置是某个查询区间的右端点,这时候就可以查询了。最后再根据查询区间的编号排序输出即可了。

注意树状数组查询0位置会出现死循环。

HDU上long long 需要使用I64d。

 #include <iostream>
 #include <cstdio>
 #include <cstring>
 #include <vector>
 #include <map>
 #include <algorithm>
 #define ll long long
 #define MAXN 100005
 using namespace std;
 int n;
 map<int,int> pos;
 struct Segment
 {
     int num,left,right;
     ll ans;
     Segment(,,):num(a),left(b),right(c)
     {
         ans=;
     }
     bool operator <(const Segment &p) const
     {
         return right<p.right;
     }
 };
 bool cmp(Segment a,Segment b)
 {
     return a.num<b.num;
 }
 struct BIT
 {
     ll dat[MAXN];
     int lowbit(int x)
     {
         return -x&x;
     }
     void clear()
     {
         memset(dat,,sizeof(dat));
     }
     void add(int x,ll val)
     {
         while(x<=n)
         {
             dat[x]+=val;
             x+=lowbit(x);
         }
     }
     ll sum(int x)
     {
         ll s=;
         )
         {
             s+=dat[x];
             x-=lowbit(x);
         }
         return s;
     }
     void modify(int x,ll val)
     {
         ) return ;
         ll t=sum(x)-sum(x-);
         add(x,-t+val);
     }
 };
 int arr[MAXN];
 vector<Segment> vec;
 BIT tree;
 int main()
 {
     int T;
     scanf("%d",&T);
     while(T--)
     {
         scanf("%d",&n);
         pos.clear();
         ; i<=n; ++i)
             scanf("%d",&arr[i]);
         int q;
         scanf("%d",&q);
         vec.clear();
         ; i<=q; ++i)
         {
             int x,y;
             scanf("%d%d",&x,&y);
             vec.push_back(Segment (i,x,y));
         }
         sort(vec.begin(),vec.end());
         tree.clear();
         ,j=; i<=n&&j<vec.size(); ++i)
         {
             tree.modify(pos[arr[i]],);
             tree.modify(i,arr[i]);
             pos[arr[i]]=i;
             while(j<vec.size()&&i==vec[j].right)
             {
                 vec[j].ans=tree.sum(vec[j].right)-tree.sum(vec[j].left-);
                 j++;

             }
         }
         sort(vec.begin(),vec.end(),cmp);
         ; i<vec.size(); ++i)
             printf("%I64d\n",vec[i].ans);
     }
     ;
 }

HDU 3333 - Turing Tree (树状数组+离线处理+哈希+贪心)的更多相关文章

  1. HDU 3333 Turing Tree --树状数组+离线处理

    题意:统计一段序列[L,R]的和,重复元素只算一次. 解法:容易看出在线做很难处理重复的情况,干脆全部讲查询读进来,然后将查询根据右端点排个序,然后离散化数据以后就可以操作了. 每次读入一个数,如果这 ...

  2. HDU 3333 Turing Tree (树状数组)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3333 题意就是询问区间不同数字的和. 比较经典的树状数组应用. //#pragma comment(l ...

  3. HDU3333 Turing Tree 树状数组+离线处理

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

  4. HDU 3333 | Codeforces 703D 树状数组、离散化

    HDU 3333:http://acm.hdu.edu.cn/showproblem.php?pid=3333 这两个题是类似的,都是离线处理查询,对每次查询的区间的右端点进行排序.这里我们需要离散化 ...

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

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

  6. HDU 3874 Necklace (树状数组 | 线段树 的离线处理)

    Necklace Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total S ...

  7. 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]< ...

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

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

  9. D-query SPOJ 树状数组+离线

    D-query SPOJ 树状数组+离线/莫队算法 题意 有一串正数,求一定区间中有多少个不同的数 解题思路--树状数组 说明一下,树状数组开始全部是零. 首先,我们存下所有需要查询的区间,然后根据右 ...

随机推荐

  1. Unity5.1 新的网络引擎UNET(二) UNET 官方推荐Demo案例

    http://blog.csdn.net/u010019717/article/details/46873153 视频 http://www.iqiyi.com/playlist391685502.h ...

  2. 如何在大量jar包中搜索特定字符

    欢迎关注我的社交账号: 博客园地址: http://www.cnblogs.com/jiangxinnju/p/4781259.html GitHub地址: https://github.com/ji ...

  3. android动画小析

    这里所讲的动画,是android framework提供的动画框架里面的动画. 是view层级的动画.不涉及到底层opengl es相关的动画实现. 动画: 主要包括 Interpolation du ...

  4. js控制手机号码中间用星号代替

    $("#tel").html($("#tel").substring(0,3)+"****"+$("#tel").sub ...

  5. Loadrunner基础:Loadrunner Controller基本概念和使用

    Loadrnner Controller 介绍 当Vuser脚本开发完成以后,可以使用Controller将这个执行脚本的用户从单用户转化为多用户,从而模拟大量用户的操作,形成负载(多用户单循环,多用 ...

  6. (15)odoo配置文件详解

    openerp-server.conf ---------------- [options]; addons模块的查找路径addons_path = E:\GreenOdoo8.0\source\op ...

  7. es根据磁盘使用情况来决定是否分配shard

    注意两个地方说法有出入,待实测! es可以根据磁盘使用情况来决定是否继续分配shard.默认设置是开启的,也可以通过api关闭:cluster.routing.allocation.disk.thre ...

  8. Tomcat配置虚拟主机的两种方式

    1.基于主机名的虚拟主机配置 在随意盘符下建立一个目录作为虚拟地址的目录.例如:F:\virtualhost1,在其下建立 test1.html,写入内容例如:test 在tomcat/conf/se ...

  9. sharepoint2010无法创建网站集

    出现以上错误,查看IIS中有关Sharepoint的网站中的“身份验证”中ASP.Net模拟是否为禁用,如果为禁用,请启用即可.

  10. [Js]高级运动

    一.链式运动框架 1.他需要一个回调函数,在运动停止时,开始下一次运动(执行函数) 多物体运动框架改为如下: function startMove(obj,attr,iTarget,fn){ ... ...