BZOJ-2743

LUOGU:https://www.luogu.org/problemnew/show/P4113

题意:

  给一个n长度的序列,m次询问区间,问区间中出现两次及以上的数字的个数。n,m,c为2e6。

思路:

  一开始用莫队写,但是tle了,莫队的复杂度是n的1.5次这道题n是2e6,复杂度逼近1e9。所以要用更加巧妙的方法,利用前缀和和树状数组维护即可。这道题不是简单的维护前缀和。因为题意说区间中要满足这个种类的物品大于两个的时候,才能加一。所以这一次离开区间的物品,影响的是最接近这个物品的同类物品(在区间中减去1),和次接近这个物品的同类物品(在区间中加1)。因此要预处理每个下标对应的下一个下标。离线处理每一个询问,按区间左端点从小到大排序。然后用一个id值从小到大遍历。

  1. #include <algorithm>
  2. #include <iterator>
  3. #include <iostream>
  4. #include <cstring>
  5. #include <iomanip>
  6. #include <cstdlib>
  7. #include <cstdio>
  8. #include <string>
  9. #include <vector>
  10. #include <bitset>
  11. #include <cctype>
  12. #include <queue>
  13. #include <cmath>
  14. #include <list>
  15. #include <map>
  16. #include <set>
  17. //#include <unordered_map>
  18. //#include <unordered_set>
  19. //#include<ext/pb_ds/assoc_container.hpp>
  20. //#include<ext/pb_ds/hash_policy.hpp>
  21. using namespace std;
  22. //#pragma GCC optimize(3)
  23. //#pragma comment(linker, "/STACK:102400000,102400000") //c++
  24. #define lson (l , mid , rt << 1)
  25. #define rson (mid + 1 , r , rt << 1 | 1)
  26. #define debug(x) cerr << #x << " = " << x << "\n";
  27. #define pb push_back
  28. #define pq priority_queue
  29.  
  30. typedef long long ll;
  31. typedef unsigned long long ull;
  32.  
  33. typedef pair<ll ,ll > pll;
  34. typedef pair<int ,int > pii;
  35. typedef pair<int ,pii> p3;
  36. //priority_queue<int> q;//这是一个大根堆q
  37. //priority_queue<int,vector<int>,greater<int> >q;//这是一个小根堆q
  38. //__gnu_pbds::cc_hash_table<int,int>ret[11]; //这是很快的hash_map
  39. #define fi first
  40. #define se second
  41. //#define endl '\n'
  42.  
  43. #define OKC ios::sync_with_stdio(false);cin.tie(0)
  44. #define FT(A,B,C) for(int A=B;A <= C;++A) //用来压行
  45. #define REP(i , j , k) for(int i = j ; i < k ; ++i)
  46. //priority_queue<int ,vector<int>, greater<int> >que;
  47.  
  48. const ll mos = 0x7FFFFFFFLL; //
  49. const ll nmos = 0x80000000LL; //-2147483648
  50. const int inf = 0x3f3f3f3f;
  51. const ll inff = 0x3f3f3f3f3f3f3f3fLL; //
  52.  
  53. const double PI=acos(-1.0);
  54.  
  55. template<typename T>
  56. inline T read(T&x){
  57. x=;int f=;char ch=getchar();
  58. while (ch<''||ch>'') f|=(ch=='-'),ch=getchar();
  59. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  60. return x=f?-x:x;
  61. }
  62.  
  63. /*-----------------------showtime----------------------*/
  64. const int maxn = 2e6+;
  65. int a[maxn],sum[maxn],nx[maxn],x[maxn],ans[maxn],cnt[maxn];
  66. int n,c,m;
  67. struct node
  68. {
  69. int l,r,id;
  70. }q[maxn];
  71. bool cmp(node a,node b){
  72. if(a.l == b.l)
  73. return a.r < b.r;
  74. return a.l < b.l;
  75. }
  76. int lowbit(int x){
  77. return x & (-x);
  78. }
  79. void add(int x,int c){
  80. while(x <= n){
  81. sum[x] += c;
  82. x+=lowbit(x);
  83. }
  84. }
  85. int query(int x){
  86. int res = ;
  87. while(x > ){
  88. res += sum[x];
  89. x -= lowbit(x);
  90. }
  91. return res;
  92. }
  93. int main(){
  94. scanf("%d%d%d", &n, &c, &m);
  95. for(int i=; i<=n; i++) scanf("%d", &a[i]);
  96.  
  97. for(int i=; i<=n; i++){
  98. cnt[a[i]]++;
  99. if(cnt[a[i]] == )add(i,);
  100. }
  101. for(int i=; i<=m; i++){
  102. scanf("%d%d", &q[i].l, &q[i].r);
  103. q[i].id = i;
  104. }
  105.  
  106. for(int i=n; i>=; i--){
  107. nx[i] = x[a[i]];
  108. x[a[i]] = i;
  109. }
  110.  
  111. sort(q+,q++m,cmp);
  112. int le = ;
  113. for(int i=; i<=m; i++){
  114. while(le < q[i].l){
  115. if(nx[le] > ) add(nx[le],-);
  116. if(nx[nx[le]] > )add (nx[nx[le]], );
  117. le++;
  118. }
  119. ans[q[i].id] = query(q[i].r) - query(q[i].l-);
  120. }
  121. for(int i=; i<=m; i++){
  122. printf("%d\n", ans[i]);
  123. }
  124. return ;
  125. }

BZOJ-2743

BZOJ-2743: [HEOI2012]采花 前缀和 树状数组的更多相关文章

  1. BZOJ_2743_[HEOI2012]采花_离线+树状数组

    BZOJ_2743_[HEOI2012]采花_离线+树状数组 Description 萧芸斓是Z国的公主,平时的一大爱好是采花.今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花 .花园足够大 ...

  2. BZOJ2743 HEOI2012采花(离线+树状数组)

    如果能够把所有区间内第二次出现某颜色的位置标记出来,树状数组查询一下就可以了. 考虑离线.按左端点从小到大排序,不断移动左端点并更新第二次出现的位置. #include<iostream> ...

  3. BZOJ2743 [HEOI2012]采花 【离线 + 树状数组】

    题目 萧芸斓是Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一排的,以便于公主采 ...

  4. BZOJ 2743: [HEOI2012]采花 离线树状数组

    2743: [HEOI2012]采花 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2743 Description 萧芸斓是Z国的公主, ...

  5. BZOJ 2743: [HEOI2012]采花 [树状数组 | 主席树]

    题意: 查询区间中出现次数$>2$的颜色个数 一眼主席树,区间中$l \le last[i] \le r$的个数减去$l \le last[last[i]] \le r$的个数,搞两颗主席树来做 ...

  6. BZOJ 2743: [HEOI2012]采花

    2743: [HEOI2012]采花 Time Limit: 15 Sec  Memory Limit: 128 MBSubmit: 2056  Solved: 1059[Submit][Status ...

  7. BZOJ 2743: [HEOI2012]采花( 离线 + BIT )

    处理出每个数下一个出现的位置, 然后按左端点排序回答询问.处理当前数去除的影响 ------------------------------------------------------------ ...

  8. bzoj 2743: [HEOI2012]采花【树状数组】

    离线,按照l排序 注意到在区间里出现两次的颜色才有贡献,所以记录一个ne[i]表示i后第一个和i同色的花,维护一个l,每次处理询问的时候l单调右移,树状数组维护,在ne[ne[i]]位置++,在ne[ ...

  9. ●BZOJ 2743 [HEOI2012]采花

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2743 题解: 树状数组,离线 求区间里面有多少种出现次数大于等于 2 的颜色. 类似某一个题 ...

随机推荐

  1. 【iOS】UILabel 常用属性设置

    UILabel 的一些常用属性,示例代码如下: // 字体大小 label.font = [UIFont systemFontOfSize:14.0]; label.font = [UIFont fo ...

  2. .net持续集成单元测试篇之单元测试简介以及在visual studio中配置Nunit使用环境

    系列目录 单元测试及测试驱动开发简介 什么是单元测试 单元测试是一段自动化的代码,这段代码调用被测试的工作单元,之后对这个单元的单个最终结果的某些假设进行检验.单元测试几乎都是用单元测试框架编写的.单 ...

  3. django数据库事务

    数据库原子操作 举个例子: 一个消费者在一个商户里刷信用卡消费,交易正常时,银行在消费者的账户里减去相应的款项,在商户的帐户加上相应的款项.但是如果银行从消费者的账户里扣完钱之后,还未在商户的帐户里加 ...

  4. 数据结构之堆栈java版

    import java.lang.reflect.Array; /* 具体原理在c++版已经说的很清楚,这里不再赘述, 就提一点:java的泛型具有边界效应,一旦离开作用域立马被替换为object类型 ...

  5. C#连接Oracle数据库字符串(引入DLL)

    需求:从一台Oracle数据库获取数据,本以为是很简单的事情,直接将原来的SqlClient换成OracleClient调用,结果远没自己想的简单.要么安装Oracle客户端,要么安装PLSQL.网上 ...

  6. Selenium+java - 日期控件的处理

    前言 一般的日期控件都是input标签下弹出来的,设置日期使用selenium中的sendKeys 方法就可以解决. 但是我们也会碰到下面的时间日期控件(这个时候这个文本框是不允许我们输入时间的)如图 ...

  7. 前端登录jq图形验证码

    <!DOCTYPE html><html lang="zh"><head> <meta charset="UTF-8" ...

  8. Vue系列:Slot 插槽的使用范例

    插槽对于自定义的组件开发来说,是十分强大的功能.这篇主要做个简单梳理 插槽可以分3种: 1.简单插槽 2.具名插槽 3.作用域插槽

  9. 二、java实现多线程的方式?

    一.同步?异步? 下面两幅图解释了同步异步. 二.实现多线程的方式 1.继承Thread package threaddemo; class CreateThreadDemo extends Thre ...

  10. 如何搭建环境---初识mybatis

    一:mybatis概念1:简介       MyBatis本是apache的一个开源项目iBatis,2010年改名为 MyBatis,       MyBatis 是一个基于Java的持久层框架.( ...