本来想写2120的,结果想起来了这个

我们先对于询问左端点排序,用树状数组存区间字母个数,对于每种字母,

第一次出现的位置记录为1,剩下的记录为0,然后记录下,每种颜色

后面第一个和他相同颜色的位置

然后扫询问,对于一个询问直接输出区间和,然后假设当前询问是

l1,r1,下一询问是,l2,r2,我们把l1到l2区间内的每个位置颜色的后一颜色

赋值成1,然后继续处理下个询问就好了。

  1. /**************************************************************
  2. Problem:
  3. User: BLADEVIL
  4. Language: Pascal
  5. Result: Accepted
  6. Time: ms
  7. Memory: kb
  8. ****************************************************************/
  9.  
  10. //By BLADEVIL
  11. var
  12. n, m :longint;
  13. a :array[..] of longint;
  14. l, r :array[..] of longint;
  15. other :array[..] of longint;
  16. last, first :array[..] of longint;
  17. num, ans :array[..] of longint;
  18. c :array[..] of longint;
  19. tot :longint;
  20.  
  21. procedure swap(var a,b:longint);
  22. var
  23. c :longint;
  24. begin
  25. c:=a; a:=b; b:=c;
  26. end;
  27.  
  28. procedure qs(low,high:longint);
  29. var
  30. i, j, x :longint;
  31. begin
  32. i:=low; j:=high; x:=l[(i+j) div ];
  33. while i<j do
  34. begin
  35. while l[i]<x do inc(i);
  36. while l[j]>x do dec(j);
  37. if i<=j then
  38. begin
  39. swap(l[i],l[j]); swap(r[i],r[j]);
  40. swap(num[i],num[j]);
  41. inc(i); dec(j);
  42. end;
  43. end;
  44. if i<high then qs(i,high);
  45. if j>low then qs(low,j);
  46. end;
  47.  
  48. procedure qs1(low,high:longint);
  49. var
  50. i, j, x :longint;
  51. begin
  52. i:=low; j:=high; x:=num[(i+j) div ];
  53. while i<j do
  54. begin
  55. while num[i]<x do inc(i);
  56. while num[j]>x do dec(j);
  57. if i<=j then
  58. begin
  59. swap(l[i],l[j]); swap(r[i],r[j]);
  60. swap(num[i],num[j]); swap(ans[i],ans[j]);
  61. inc(i); dec(j);
  62. end;
  63. end;
  64. if i<high then qs1(i,high);
  65. if j>low then qs1(low,j);
  66. end;
  67.  
  68. procedure init;
  69. var
  70. i :longint;
  71. begin
  72. read(n);
  73. for i:= to n do
  74. begin
  75. read(a[i]);
  76. if tot<a[i] then tot:=a[i];
  77. end;
  78.  
  79. read(m);
  80. for i:= to m do read(l[i],r[i]);
  81. for i:= to m do num[i]:=i;
  82. qs(,m);
  83. for i:= to n do
  84. if last[a[i]]<> then
  85. begin
  86. other[last[a[i]]]:=i;
  87. last[a[i]]:=i;
  88. end else
  89. begin
  90. last[a[i]]:=i;
  91. first[a[i]]:=i;
  92. end;
  93. end;
  94.  
  95. procedure add(x:longint);
  96. begin
  97. while x<=n do
  98. begin
  99. c[x]:=c[x]+;
  100. x:=x+(x and (-x));
  101. end;
  102. end;
  103.  
  104. function ask(x:longint):longint;
  105. begin
  106. ask:=;
  107. while x> do
  108. begin
  109. ask:=ask+c[x];
  110. x:=x-(x and (-x));
  111. end;
  112. end;
  113.  
  114. procedure main;
  115. var
  116. i, j :longint;
  117. ll :longint;
  118. begin
  119. for i:= to tot do if first[i]<> then add(first[i]);
  120. ll:=;
  121. for i:= to m do
  122. begin
  123. for j:=ll to l[i]- do if other[j]<> then add(other[j]);
  124. ans[i]:=ask(r[i])-ask(l[i]-);
  125. ll:=l[i];
  126. end;
  127. qs1(,m);
  128. for i:= to m do writeln(ans[i]);
  129. end;
  130.  
  131. begin
  132. init;
  133. main;
  134. end.

bzoj 1878 SDOI2009树状数组 离线操作的更多相关文章

  1. HDU3874Necklace(树状数组+离线操作)

    此题的大意思说有一串珠子,每个珠子都有自己的欣赏值value,现在给你一串珠子每个的欣赏值,并给出一些询问,查询某个区间内部总欣赏值是多少,但是有一个约定就是如果这个区间内部有两个珠子的欣赏值是一样的 ...

  2. HDU---4417Super Mario 树状数组 离线操作

    题意:给定 n个数,查询 位置L R内 小于x的数有多少个. 对于某一次查询 把所有比x小的数 ”的位置“ 都加入到树状数组中,然后sum(R)-sum(L-1)就是答案,q次查询就要离线操作了,按高 ...

  3. HDU 4630 No Pain No Game 树状数组+离线操作

    题意:给一串数字,每次查询[L,R]中两个数的gcd的最大值. 解法:容易知道,要使取两个数让gcd最大,这两个数最好是倍数关系,所以处理出每个数的所有倍数,两两间根据倍数关系形成一条线段,值为该数. ...

  4. Codeforces 369E Valera and Queries --树状数组+离线操作

    题意:给一些线段,然后给m个查询,每次查询都给出一些点,问有多少条线段包含这个点集中的一个或多个点 解法:直接离线以点为基准和以线段为基准都不好处理,“正难则反”,我们试着求有多少线段是不包含某个查询 ...

  5. BZOJ 2141 排队(树状数组套主席树)

    解法很多的题,可以块套树状数组,可以线段树套平衡树.我用的是树状数组套主席树. 题意:给出一段数列,m次操作,每次操作是交换两个位置的数,求每次操作后的逆序对数.(n,m<=2e4). 对于没有 ...

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

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

  7. bzoj 4785: [Zjoi2017]树状数组【树套树】

    参考:https://www.cnblogs.com/ljh2000-jump/p/6686960.html 由于操作反过来了,所以显然树状数组维护后缀和,所以本来想查询(1,r)-(1,l-1),现 ...

  8. BZOJ 3262(Treap+树状数组)

    题面 传送门 分析 分三维考虑 对第一维,直接排序 对第二维和第三维,我们这样考虑 朴素的方法是建k棵Treap,第i棵Treap里存第二维值为k的第三维数值 每次查询一组(a,b,c),只要在1~b ...

  9. BZOJ 4765(分块+树状数组)

    题面 传送门 "奋战三星期,造台计算机".小G响应号召,花了三小时造了台普通计算姬.普通计算姬比普通计算机要厉害一些 .普通计算机能计算数列区间和,而普通计算姬能计算树中子树和.更 ...

随机推荐

  1. Java日志(一):log4j与.properties配置文件

    日志是应用软件中不可缺少的部分,Apache的开源项目log4j是一个功能强大的日志组件,提供方便的日志记录,在Apache网站jakarta.apache.org/log4j可以免费下载到Log4j ...

  2. Sersync实时备份服务部署实践

  3. BZOJ 4184 shallot 线性基+分治

    Description 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且让小葱从 ...

  4. 详细讲解Java中方法的重载和重写

    首先讲讲方法的重载: Java的重载就是在类中可以创建多个方法,它们具有相同的名字,但是却有不同的参数. 判断是否重载只有两个条件: 1)相同的方法名 2)不同的参数 具体为: A.方法参数类型不同 ...

  5. OpenCV中的按钮问题

    在HighGUI中,没有显示提供任何形式的按钮.一般有两种方法替代: 1.用只有两个状态的滑动条来替代按钮.开关(switch)事实上就是只有两个状态的滑动条,这两个状态是on和off.然后通过回调函 ...

  6. 2017北大校赛 J题 pairs

    题目链接 http://poj.openjudge.cn/practice/C17J/ orz 原来是一道无脑枚举题目 只是很卡常数而已 复杂度算错也是很醉orz 当时怎么没想着优化常数呢 题解:枚举 ...

  7. WCF分布式开发步步为赢(15):错误契约(FaultContract)与异常处理(ExceptionHandle)

    今天学习WCF分布式开发步步为赢系列的15节:错误契约(FaultContract)与异常处理(ExceptionHandle).本节内容作为WCF分布式开发的一个重要知识点,无论在学习还是项目中都应 ...

  8. D. Relatively Prime Graph

    Let's call an undirected graph G=(V,E)G=(V,E) relatively prime if and only if for each edge (v,u)∈E( ...

  9. 在xml文件中引入带有@Configuration的Java类

    在xml引入带有@Configuration的Java类,就是把这个带有@Configuration的Java类,当做一个普通的的类用<bean>标签引入: 核心代码如下: @Config ...

  10. Ubuntu修改grub启动顺序和启动时间

    sudo gedit /boot/grub/grub.cfg,输入密码,在弹出的文件中找到set default = "0",想要改为第N项默认就把0改成N-1 看到启动界面是第几 ...