题目: http://acm.hdu.edu.cn/showproblem.php?pid=3874

对需要查询的区间按右端点排序,然后从左到右依次加入序列中的元素,同时更新,更新的方法是,把上一次出现a[i]值的点变为0,这一次a[i]值的点(即 i)变为a[i],这样保证了前i个元素中只存在一个等于a[i]值得元素,那为什么这样不会影响后面的查询呢?

因为是处理到i点,则把右边界等于a[i]的查询处理掉,剩下的待查询的区间右边界在i点之后,如果左边界在i之前,那么也会包含i点,也就包含了i点的值,由于i以前没有等于a[i]的点,所以只包含了一个这样的值,如果左边界在i之后,前面的操作对它就没影响了。也可以这样理解,当前处理到i点,如果后面的待查询区间的左边界要包含上一个值为a[i]的点,那么它必须也包含了i点,所以i之前等于a[i]的点完全可以舍弃-----------------原来先排序的处理方式还有个专业名字叫=======离线操作

话不多说,看代码:

  1. /**********************************************
  2. *** Problem:
  3. *** Author: JKL
  4. *** University: CSUST
  5. *** Team: __Dream
  6. *** Email: 1451108308@QQ.COM
  7. *** My Blog: http://www.cnblogs.com/jklongint/
  8. ***********************************************/
  9. //===================================================
  10. #include <iostream>
  11. #include <fstream>
  12. #include <sstream>
  13. #include <iomanip>
  14. #include <cstdio>
  15. #include <cstdlib>
  16. #include <cmath>
  17. #include <cassert>
  18. #include <numeric>
  19. #include <ctime>
  20. #include <algorithm>
  21. #include <cstring>
  22. #include <string>
  23. #include <vector>
  24. #include <queue>
  25. #include <map>
  26. #include <stack>
  27. #include <list>
  28. #include <set>
  29. #include <bitset>
  30. #include <deque>
  31. using namespace std;
  32. //---------------------------------------------------
  33. #define mem(a,b) memset(a,b,sizeof(a))
  34. #define GO cout<<"HelloWorld!"<<endl
  35. #define Case(x) cout<<"Case "<<x<<":"
  36. #define foru(i,n) for(int i=1; i <= n; i++)
  37. #define ford(i,n) for(int i = n; i >= 1; i--)
  38. #define fin freopen("input.txt","r",stdin);
  39. #define fout freopen("output.txt","w",stdout)
  40. #define lson l, m, rt << 1
  41. #define rson m + 1, r, rt << 1 | 1
  42.  
  43. #define sqr(a) ((a)*(a))
  44. #define abs(a) ((a>0)?(a):-(a))
  45. #define pii pair<int,int>
  46.  
  47. #define fmax(a,b) max(a,b)
  48. #define fmin(a,b) min(a,b)
  49. #define fmax3(a,b,c) (fmax(a,fmax(a,b)))
  50. #define fmin3(a,b,c) (fmin(a,fmin(a,b)))
  51.  
  52. #define sfi(x) scanf("%d",&x)
  53. #define sfL(x) scanf("%I64d",&x)
  54. #define sfc(x) scanf("%c",&x)
  55. #define sfd(x) scanf("%lf",&x)
  56. #define sfs(x) scanf("%s",x)
  57. #define sfii(a,b) scanf("%d%d",&a,&b)
  58. #define sfLL(a,b) scanf("%I64d%I64d",&a,&b)
  59. #define sfcc(a,b) scanf("%c%c",&a,&b)
  60. #define sfdd(a,b) scanf("%lf%lf",&a,&b)
  61. #define sfss(a,b) scanf("%s%s",a,b)
  62.  
  63. #define pfi(x) printf("%d",x)
  64. #define pfL(x) printf("%I64d",x)
  65. #define pfs(x) printf("%s",x)
  66. #define pfd(x) printf("%lf",x)
  67. #define pfc(x) print("%c",x)
  68. #define newLine pfs("\n")
  69. #define space pfs(" ")
  70.  
  71. //--------------------------------------------------------
  72. typedef __int64 LL;
  73. typedef unsigned long long ULL;
  74. //typedef __int64 __LL;
  75. typedef unsigned __int64 __ULL;
  76.  
  77. typedef vector<int> vi;
  78. typedef vector<LL> vL;
  79. typedef vector<string> vs;
  80. typedef set<int> si;
  81. typedef map<int,int> mii;
  82. typedef map<LL,LL> mLL;
  83. typedef map<string,int> msi;
  84. typedef map<char,int> mci;
  85. //--------------------------------------------------------
  86. const int dx[]={,-,,};
  87. const int dy[]={,,,-};
  88. const int day[]={,,,,,,,,,,,,};
  89. const int N6=;
  90. const int N5=;
  91. const int N4=;
  92. const int N3=;
  93. const int N2=;
  94. const int N=;
  95. const int MOD=;
  96. const LL LMAX=0x7fffffffffffffff;
  97. const LL IMAX=0x3fffffff;
  98. const double PI=3.14159265359;
  99. //--------------------------------------------------------
  100. template< class T > T gcd(T a, T b) { return (b != ? gcd<T>(b, a%b) : a); }
  101. template< class T > T lcm(T a, T b) { return (a / gcd<T>(a, b) * b); }
  102.  
  103. //------------------------------------------------------------
  104. struct TreeNode{
  105. LL sum;
  106. };
  107. struct Node{
  108. int l, r, id;
  109. };
  110. //=================================================================
  111. TreeNode tree[N << ];
  112. Node node[N];
  113. int a[N], last[];
  114. LL ans[N];
  115. int cmp(Node i, Node j)
  116. {
  117. return i.r < j.r ;
  118. }
  119. void PushUP(int rt)
  120. {
  121. tree[rt].sum = tree[rt << ].sum + tree[rt << | ].sum;
  122. }
  123. void update(int p, int x, int l , int r, int rt)
  124. {
  125. if(l == r){
  126. tree[rt].sum += x;
  127. return;
  128. }
  129. int m = (l + r) >> ;
  130. if(p <= m)update(p, x, lson);
  131. else update(p, x, rson);
  132. PushUP(rt);
  133. }
  134. LL query(int L, int R, int l, int r, int rt)
  135. {
  136. if(L <= l && R >= r){
  137. return tree[rt].sum;
  138. }
  139. int m = (l + r) >> ;
  140. LL res = ;
  141. if(L <= m) res += query(L, R, lson);
  142. if(R > m) res += query(L, R, rson);
  143. return res;
  144. }
  145. void build(int l, int r, int rt)
  146. {
  147. if(l == r){
  148. tree[rt].sum = ;
  149. return;
  150. }
  151. int m = (l + r) >> ;
  152. build(lson);
  153. build(rson);
  154. PushUP(rt);
  155. }
  156. int main()
  157. {
  158. //fin;//fout;//freopen("input.txt","r",stdin);
  159. int n, m, T;
  160. cin >> T;
  161. while(T--){
  162. cin >> n ;
  163. foru(i, n)sfi(a[i]);
  164. cin >> m;
  165. foru(i, m)sfii(node[i].l, node[i].r),node[i].id = i;
  166. sort(node + , node + + m, cmp);
  167. build(, n, );
  168. int np = ;
  169. mem(last, );
  170. foru(i, n){
  171. if(last[a[i]])update(last[a[i]], -a[i], , n, );
  172. update(i, a[i], , n, );
  173. while(node[np].r == i && np <= m){
  174. ans[node[np].id] = query(node[np].l, node[np].r, , n, );
  175. np++;
  176. }
  177. last[a[i]] = i;
  178. }
  179. foru(i, m)pfL(ans[i]),newLine;
  180. }
  181. return ;
  182. }

HDU 3874 Necklace 区间查询的离线操作的更多相关文章

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

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

  2. hdu 3874 Necklace(bit树+事先对查询区间右端点排序)

    Mery has a beautiful necklace. The necklace is made up of N magic balls. Each ball has a beautiful v ...

  3. HDU - 3874 Necklace (树状数组、离线处理)

    题目链接:Necklace 题意: 给出一串珠子,每个珠子有它的value,现在给出n(n<=5e4)个珠子的value(1<=value<=1e6),现在给出m(1<=m&l ...

  4. HDU - 3874 Necklace (线段树 + 离线处理)

    欢迎參加--每周六晚的BestCoder(有米! ) Necklace Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 65536/3 ...

  5. hdu 3874 Necklace(线段树)

    这道题目和我之前做过的一道3xian大牛出的题目很像,不过总的来说还是要简单一点儿. 计算区间内的值的时候如果两个值相等,只能计算其中一个. 这道题需要将所有的问题输入之后再计算,首先,对所有问题的右 ...

  6. HDU 3874 Necklace

    莫队算法. #include<cstdio> #include<cstring> #include<cmath> #include<queue> #in ...

  7. HDU 3874 Necklace 树状数组

    题意:求区间内不同的数的和 离线处理,按查询右端点从小到大排序,从左往右扫一遍. 记录每个数出现的上一个位置,如果该数之前没有出现过,就加上,否则就在上一个位置减去. #include <cst ...

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

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

  9. hdu 5727 Necklace dfs+二分图匹配

    Necklace/center> 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5727 Description SJX has 2*N mag ...

随机推荐

  1. codeforces Equalizing by Division (easy version)

    output standard output The only difference between easy and hard versions is the number of elements ...

  2. mysql datetime类型 按格式在页面输出

    mysql datetime类型对应java Date类型   java.util.Date类型会显示时间戳 java.sql.Date 只显示年月日不显示时分秒 只需要重写get方法 就能按格式输出 ...

  3. SpringCloud-Bus 消息总线

    概述 基本介绍 Spring Cloud Bus 目前支持两种消息代理:RabbitMQ.Kafka Spring Cloud Config 配合 Spring Cloud Bus 使用可以实现配置的 ...

  4. 新的知识点来了-ES6 Proxy代理 和 去银行存款有什么关系?

    ES给开发者提供了一个新特性:Proxy,就是代理的意思.也就是我们这一节要介绍的知识点. 以前,ATM还没有那么流行的时候(暴露年纪),我们去银行存款或者取款的时候,需要在柜台前排队,等柜台工作人员 ...

  5. 详解数组分段和最大值最小问题(最小m段和问题)

    数组分段和最大值最小问题(最小m段和问题) 问题描述 给定n个整数组成的序列,现在要求将序列分割为m段,每段子序列中的数在原序列中连续排列.如何分割才能使这m段子序列的和的最大值达到最小? 清洁工:假 ...

  6. 前端基础-HTML(1)

    1.浏览器: 1.1 浏览器内核: 渲染引擎和JS引擎 渲染引擎:负责页面内容的在(html,xml,图像等).整理讯息(加入css等),以及计算网页的显示方式,然后输出至显示器后者打印机 JS引擎: ...

  7. thinkphp5 input坑

    取值方式改了而已?a1=1&a2=2这种可以用input(get.) a1/1/a2/2 用input('a1')和input('a2') post方法当然是input('post.') 我觉 ...

  8. kubeadm 默认镜像配置问题引申

    背景: 每次使用功能kubeadm的时候都需要提前准备好镜像,为什么自定义使用的镜像源呢? 在没有翻越围墙时 kubeadm init --kubernetes-version=v1.13.0 --p ...

  9. Spring5参考指南:AspectJ高级编程之Configurable

    文章目录 遇到的问题 @Configurable 原理 重要配置 遇到的问题 前面的文章我们讲到了在Spring中使用Aspect.但是Aspect的都是Spring管理的Bean. 现在有一个问题, ...

  10. CodeForces - 1102B Array K-Coloring

    B. Array K-Coloring time limit per test2 seconds memory limit per test256 megabytes inputstandard in ...