题目链接:点击进入

题目



思路

跟此题相似:HH的项链
对于若干个询问的区间 [ l , r ] ,如果他们的 r 都相等的话,那么对于数组中出现的同一个数字,因为要求只有每个数出现至少两次才可以计入答案,那么我们只需要关心出现在最右边的第二个的即可。( r 固定情况下,只需要看 l 与这第二个的大小关系来判断这个数可不可以计入答案 )
对 [ 1 , r ] 保留所有数离 r 第二近的那个,剩下的扔掉。那么此时求前缀和 sum , sum [ r ] 就是 [ 1 , r ] 的不同颜色的数量,那么询问区间 [ l, r ] 答案就是 sum [ r ] - sum [ l - 1 ] 。
因此,我们可以对所有查询的区间按照 r 来排序,然后再来维护一个树状数组,同时维护一个 last1 数组与 last2 数组,分别记录颜色 x 最近第一次出现的位置与最近第二次出现的位置。我们每次修改将上一次的第二个最近位置-1,然后将新的最近第二次位置的+1。
位置加入就是 add ( i ,1 ) ,位置删除就是 add ( i , -1 ) ;
思路借鉴于:wangjyqh

代码

// Problem: P4113 [HEOI2012]采花
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P4113
// Memory Limit: 500 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)//#pragma GCC optimize(3)//O3
//#pragma GCC optimize(2)//O2
#include<iostream>
#include<string>
#include<map>
#include<set>
//#include<unordered_map>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<fstream>
#define X first
#define Y second
#define best 131
#define INF 0x3f3f3f3f3f3f3f3f
#define pii pair<int,int>
#define lowbit(x) x & -x
#define inf 0x3f3f3f3f
//#define int long long
//#define double long double
//#define rep(i,x,y) for(register int i = x; i <= y;++i)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const double pai=acos(-1.0);
const int maxn=2e6+10;
const int mod=1e9+7;
const double eps=1e-9;
const int N=5e3+10;
/*--------------------------------------------*/
inline int read()
{int k = 0, f = 1 ;char c = getchar() ;while(!isdigit(c)){if(c == '-') f = -1 ;c = getchar() ;}while(isdigit(c)) k = (k << 1) + (k << 3) + c - 48 ,c = getchar() ;return k * f ;
}
/*--------------------------------------------*/int n,m,limit,c[maxn],a[maxn];
int last1[maxn],last2[maxn],ans[maxn];
struct node
{int l;int r;int pos;bool operator <(const node &t)const{return r<t.r;}
}p[maxn];
void add(int x,int val)
{for(int i=x;i<=n;i+=lowbit(i)) c[i]+=val;
}
int getsum(int x)
{int sum=0;for(int i=x;i>=1;i-=lowbit(i)) sum+=c[i];return sum;
}int main()
{// ios::sync_with_stdio(false);// cin.tie(0);cout.tie(0);scanf("%d%d%d",&n,&limit,&m);for(int i=1;i<=n;i++) scanf("%d",&a[i]);for(int i=1;i<=m;i++){scanf("%d%d",&p[i].l,&p[i].r);p[i].pos=i;}sort(p+1,p+m+1);int j=1;for(int i=1;i<=n;i++){if(!last1[a[i]]) last1[a[i]]=i;else{if(!last2[a[i]]){last2[a[i]]=last1[a[i]];last1[a[i]]=i;add(last2[a[i]],1);}else{add(last2[a[i]],-1);last2[a[i]]=last1[a[i]];last1[a[i]]=i;add(last2[a[i]],1);}}   while(j<=m&&p[j].r==i){ans[p[j].pos]=getsum(p[j].r)-getsum(p[j].l-1);j++;}}for(int i=1;i<=m;i++)printf("%d\n",ans[i]);return 0;
}

P4113 [HEOI2012]采花 ( 树状数组 + 离线 )相关推荐

  1. P4113 [HEOI2012]采花 树状数组离线

    题意: 询问区间内有多少个出现次数大于等于2次数的种类. n<=2e6 题解: 主要是n<=2e6,不然确实有很多种做法 跟HH的项链一样的思路,发现是离线,想了一会发现好像跟hh的项链一 ...

  2. 洛谷P4113 [HEOI2012]采花 题解

    洛谷P4113 [HEOI2012]采花 题解 题目链接:P4113 [HEOI2012]采花 题意:萧薰儿是古国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园 ...

  3. P4113 [HEOI2012]采花 【树状数组 AC】【莫队/主席树 TLE】

    传送门 题意简述:给定一个长度为 n 的序列,有 m 次询问,每次询问一段区间,求区间中有多少个数出现次数超过 1 次 这道题真的有点恶心...在洛谷上属于莫队,但是莫队会T,数据居然有2e6.莫队的 ...

  4. hdu 3333 树状数组+离线处理

    思路:既然要求的是不同的元素的和,那么我们可以想办法让每个值在区间中只出现一次,于是想到了离线的算法:将查询按照右端点排序,位置在右端点之前的元素都插入到树状数组中,对于已经出现过的值,我们要先删除( ...

  5. hdu 4417(树状数组+离线算法)

    解题思路:这道题要求某区间内比h小的个数,其实这里可以类似于树状数组求逆序数那样.关键是如何转换成树状数组的模型,这才是本题的难点. 我们首先分析,如果知道h在该区间的哪个位置,那么剩下的就很好做了. ...

  6. Sereja and Brackets CodeForces - 380C (树状数组+离线)

    Sereja and Brackets 题目链接: CodeForces - 380C Sereja has a bracket sequence s1, s2, ..., *s**n, or, in ...

  7. SPOJ D-query 树状数组离线 求区间内不同数字的个数

    Given a sequence of n numbers a1, a2, -, an and a number of d-queries. A d-query is a pair (i, j) (1 ...

  8. 2019 南京 网络赛 B (二维偏序,树状数组离线)

    题意: 给出一N*N的蛇形矩阵,具体位置元素值不给你,自己找规律,然后给你M个 有效位置,P次查询,每次查询一个子矩阵中有效元素的权值和,该权值和等于对于 每个有效元素,模10拆分后相加得到的和.(注 ...

  9. 2016 UESTC Training for Data Structures O - 卿学姐种美丽的花 树状数组+等差数列

    O - 卿学姐种美丽的花 Time Limit: 8000/4000MS (Java/Others)     Memory Limit: 125535/65535KB (Java/Others) Su ...

最新文章

  1. c-free为什么要多输入一条_为什么微信语音不能转发?知道真相后才发现我们都错怪了微信!...
  2. Delphi中类型转换函数
  3. Java框架学习顺序是哪些?
  4. linux下hg无法运行_在 Windows 里也可以访问 Linux 子系统文件了
  5. Java8 Lambdas:解释性能缺陷的排序
  6. 使用Spring Roo进行快速云开发–第2部分:VMware Cloud Foundry
  7. tmux常用命令(分屏工具)
  8. 字符函数、字符串函数、内存函数用法及其模拟实现
  9. JAVA创建对象有哪几种方式
  10. 帆软统计函数之统计有效性
  11. 【问题解决】VS Code官网下载速度慢的解决办法
  12. linux opendir php,PHP遍历目录函数opendir()、readdir()、closedir()、rewinddir()总结
  13. 什么是503服务不可用错误(以及如何解决)?
  14. 2021年六级英文作文:China’s achievement in higher education.
  15. java 完全解耦_java-完全解耦
  16. 机器学习项目实战——10决策树算法之动物分类
  17. php卡片式,50+创意卡片式网站欣赏
  18. pytorch自学教程(一)
  19. C++ STL标准模板库简介
  20. 免费开源很不错的报表工具xdoc

热门文章

  1. 物联网设备固件分析:Firmadyne固件模拟环境搭建
  2. 【jenkins】jenkins旧版本下载
  3. WEB前端:(3)HTML5②超链接及页面内跳转
  4. Java基础语法(三)——运算符
  5. 市北·GMIS 2019 全球数据智能峰会全记录
  6. eclipse refreshing external folders解决方案
  7. Python图像处理(车牌识别)简单
  8. Javascript迭代、递推、穷举、递归常用算法实例讲解
  9. vue 视频播放插件vue-video-player自定义样式、自动播放设置、设置一开始全屏播放视频
  10. numpy函数hstack,vstack,dstack简介