题意

给出一串数字以及q次查询,每次查询l,r],要求求出[1,l]和[r,n]的所有不相同的数字个数。

分析

先对数组进行倍增,变为两倍长,然后查询就变成一个完整的区间。离线处理,按r从小到大排序,数组从1到2n扫一遍,每次更新每种数最后出现的位置,用树状数组处理。把前一次出现位置在树状数组里面更新-1(由于r从小到大查询,为了正确求出[l,r]中的不同数字数,必须更新最新的同时把旧的删去,目的在于以最新的位置判断,避免重复),这次的位置更新+1,然后如果扫描到的i>=r则对查询区间进行求和查询。

  1. #include<iostream>
  2. #include<cmath>
  3. #include<cstring>
  4. #include<queue>
  5. #include<vector>
  6. #include<cstdio>
  7. #include<algorithm>
  8. #include<map>
  9. #include<set>
  10. #define rep(i,e) for(int i=0;i<(e);i++)
  11. #define rep1(i,e) for(int i=1;i<=(e);i++)
  12. #define repx(i,x,e) for(int i=(x);i<=(e);i++)
  13. #define X first
  14. #define Y second
  15. #define PB push_back
  16. #define MP make_pair
  17. #define mset(var,val) memset(var,val,sizeof(var))
  18. #define scd(a) scanf("%d",&a)
  19. #define scdd(a,b) scanf("%d%d",&a,&b)
  20. #define scddd(a,b,c) scanf("%d%d%d",&a,&b,&c)
  21. #define pd(a) printf("%d\n",a)
  22. #define scl(a) scanf("%lld",&a)
  23. #define scll(a,b) scanf("%lld%lld",&a,&b)
  24. #define sclll(a,b,c) scanf("%lld%lld%lld",&a,&b,&c)
  25. #define IOS ios::sync_with_stdio(false);cin.tie(0)
  26. #define lc idx<<1
  27. #define rc idx<<1|1
  28. #define rson mid+1,r,rc
  29. #define lson l,mid,lc
  30. using namespace std;
  31. typedef long long ll;
  32. template <class T>
  33. void test(T a) {
  34. cout<<a<<endl;
  35. }
  36. template <class T,class T2>
  37. void test(T a,T2 b) {
  38. cout<<a<<" "<<b<<endl;
  39. }
  40. template <class T,class T2,class T3>
  41. void test(T a,T2 b,T3 c) {
  42. cout<<a<<" "<<b<<" "<<c<<endl;
  43. }
  44. const int inf = 0x3f3f3f3f;
  45. const ll INF = 0x3f3f3f3f3f3f3f3fll;
  46. const ll mod = 1e9+;
  47. int T;
  48. void testcase() {
  49. printf("Case %d: ",++T);
  50. }
  51. const int MAXN = 2e5+;
  52. const int MAXM = ;
  53. const double PI = acos(-1.0);
  54. const double eps = 1e-;
  55.  
  56. struct node{
  57. int l,r,id;
  58. bool operator <(const node &b)const{
  59. return r<b.r;
  60. }
  61. }Q[MAXN];
  62.  
  63. int n,q;
  64. int bit[MAXN],a[MAXN],ans[MAXN];
  65. int last[MAXN];
  66.  
  67. int lowbit(int x){ return x&-x; }
  68. void update(int x,int d){
  69. while(x<=n){
  70. bit[x]+=d;
  71. x+=lowbit(x);
  72. }
  73. }
  74. int query(int x){
  75. int res=;
  76. while(x>){
  77. res+=bit[x];
  78. x-=lowbit(x);
  79. }
  80. return res;
  81. }
  82. int query(int l,int r){
  83. return query(r)-query(l-);
  84. }
  85.  
  86. int main() {
  87. #ifdef LOCAL
  88. freopen("data.in","r",stdin);
  89. #endif // LOCAL
  90. while(~scdd(n,q)){
  91. for(int i=;i<=n;i++) scd(a[i]),a[i+n]=a[i];
  92.  
  93. for(int i=;i<q;i++){
  94. scdd(Q[i].l,Q[i].r);
  95. Q[i].id=i;
  96. Q[i].l+=n;
  97. swap(Q[i].l,Q[i].r);
  98. }
  99. n<<=;
  100. sort(Q,Q+q);
  101. mset(last,);
  102. mset(bit,);
  103. int k=;
  104. for(int i=;i<=n&&k<q;i++){
  105. if(last[a[i]]) update(last[a[i]],-);
  106. last[a[i]]=i;
  107. update(last[a[i]],);
  108. while(k<q&&Q[k].r<=i){
  109. ans[Q[k].id]=query(Q[k].l,Q[k].r);
  110. k++;
  111. }
  112. }
  113. for(int i=;i<q;i++){
  114. printf("%d\n",ans[i]);
  115. }
  116. }
  117. return ;
  118. }

2018牛客网暑期ACM多校训练营(第一场)J Different Integers(树状数组)的更多相关文章

  1. 2018牛客网暑期ACM多校训练营(第二场)I- car ( 思维)

    2018牛客网暑期ACM多校训练营(第二场)I- car 链接:https://ac.nowcoder.com/acm/contest/140/I来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 ...

  2. 2018牛客网暑期ACM多校训练营(第一场)D图同构,J

    链接:https://www.nowcoder.com/acm/contest/139/D来源:牛客网 同构图:假设G=(V,E)和G1=(V1,E1)是两个图,如果存在一个双射m:V→V1,使得对所 ...

  3. 2018 牛客网暑期ACM多校训练营(第一场) E Removal (DP)

    Removal 链接:https://ac.nowcoder.com/acm/contest/139/E来源:牛客网 题目描述 Bobo has a sequence of integers s1, ...

  4. 2018牛客网暑期ACM多校训练营(第十场)A Rikka with Lowbit (树状数组)

    链接:https://ac.nowcoder.com/acm/contest/148/A 来源:牛客网 Rikka with Lowbit 时间限制:C/C++ 5秒,其他语言10秒 空间限制:C/C ...

  5. 2018牛客网暑期ACM多校训练营(第十场)J Rikka with Nickname(二分,字符串)

    链接:https://ac.nowcoder.com/acm/contest/148/J?&headNav=acm 来源:牛客网 Rikka with Nickname 时间限制:C/C++ ...

  6. 2018牛客网暑期ACM多校训练营(第二场)J Farm(树状数组)

    题意 n*m的农场有若干种不同种类作物,如果作物接受了不同种类的肥料就会枯萎.现在进行t次施肥,每次对一个矩形区域施某种类的肥料.问最后枯萎的作物是多少. 分析 作者:xseventh链接:https ...

  7. 2018牛客网暑期ACM多校训练营(第一场)B Symmetric Matrix(思维+数列递推)

    题意 给出一个矩阵,矩阵每行的和必须为2,且是一个主对称矩阵.问你大小为n的这样的合法矩阵有多少个. 分析 作者:美食不可负064链接:https://www.nowcoder.com/discuss ...

  8. 2018牛客网暑期ACM多校训练营(第五场) F - take - [数学期望][树状数组]

    题目链接:https://www.nowcoder.com/acm/contest/143/F 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K ...

  9. 2018牛客网暑期ACM多校训练营(第二场) J - farm - [随机数哈希+二维树状数组]

    题目链接:https://www.nowcoder.com/acm/contest/140/J 时间限制:C/C++ 4秒,其他语言8秒 空间限制:C/C++ 262144K,其他语言524288K ...

  10. 2018牛客网暑期ACM多校训练营(第三场) A - PACM Team - [四维01背包][四约束01背包]

    题目链接:https://www.nowcoder.com/acm/contest/141/A 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K ...

随机推荐

  1. MT【293】拐点处切线

    (2018浙江高考压轴题)已知函数$f(x)=\sqrt{x}-\ln x.$(2)若$a\le 3-4\ln 2,$证明:对于任意$k>0$,直线$y=kx+a$ 与曲线$y=f(x)$有唯一 ...

  2. zabbix agent 自定义 UserParameter

    有时候我们想让被监控端执行一个zabbix没有预定义的检测,zabbix的用户自定义参数功能提供了这个方法.我们可以在客户端配置文件zabbix_angentd.conf里面配置UserParamet ...

  3. 基数排序模板(基数排序,C++模板)

    算法的理论学习可右转Creeper_LKF大佬的洛谷日报 一个优化算法理论时间复杂度的实例点这里 另一个实例点这里 时间复杂度\(O(n)\),算常数的话要乘位长. 蒟蒻参考了Creeper_LKF大 ...

  4. 本文之后都以Vol1来指代

    本文参考文档是<64-ia-32-architectures-software-developer-vol-1-manual>(本文之后都以Vol1来指代),介绍了x86架构的基础.这些基 ...

  5. [SDOI2015]序列统计(多项式快速幂)

    题目描述 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属于集合S.小C用这个生成器生成了许多这样的数列.但是小C有一个问 ...

  6. Nio再学习之NIO的buffer缓冲区

    1. 缓冲区(Buffer): 介绍 我们知道在BIO(Block IO)中其是使用的流的形式进行读取,可以将数据直接写入或者将数据直接读取到Stream对象中,但是在NIO中所有的数据都是使用的换冲 ...

  7. firfox中"content-disposition", "attachment;filename=“+filename不能显示文件名字

    一般要在浏览器中显示文件名,可以使用以下文件名 // 设置文件名的编码方式,使得文件的名字能够正常安全的显示. filename = URLEncoder.encode(filename, " ...

  8. postman 测试套件collection

    测试套件collection就是为了跑一套case,整体的一套case,为了解决一个一个的case单独跑 1.点击小加号 2.填写套件的名字 3.右键增加folder,一个folder里面可以增加多个 ...

  9. C++ template一些体悟(3)

    其实没啥体悟,因为还没有感受到这些例子的作用,记一下先 #include <iostream> using namespace std; class alloc { }; template ...

  10. python学习笔记:python异常的调用原理

    因为错误是class,捕获一个错误就是捕获到该class的一个实例.因此,错误并不是凭空产生的,而是有意创建并抛出的.Python的内置函数会抛出很多类型的错误,我们自己编写的函数也可以抛出错误. h ...