交题链接

给你一个长度为 \(n(n\le 10^6)\) 的序列,其中每个元素都在 \([1,n]\) 范围中。

询问有多少个区间满足区间中的元素都恰好出现 \(2\) 次。

\(\texttt{solution}~\texttt{1:}\) 哈希

我们考虑如果元素个数 \(\le 64\) 时我们怎么做:

给每个元素分配一个二进制位,记录到当前为止的异或和,同时用 map 记录同为这个异或和的位置数量(当然要保证出现位置在这个元素上上次出现以后),并累加答案。

但是如果元素个数过多怎么办?答案是哈希!!!

我们给每个元素随机附上一个值,向上面一样添加和求出答案。

事实证明在随机赋值是正确率是非常高的。

$\texttt{code}$
#define Maxn 1000005
typedef unsigned long long ll;
int n,pos;
ll ans;
int a[Maxn],llast[Maxn],last[Maxn];
ll ha[Maxn],pre[Maxn];
unordered_map<ll,int> cnt;
int main()
{srand(time(0));n=rd();for(int i=1;i<=n;i++) a[i]=rd(),ha[i]=1llu*rand()*rand()*rand()*rand()*rand()*rand();cnt[0]++;for(int i=1;i<=n;i++){while(pos<llast[a[i]]) cnt[pre[pos]]--,pos++;llast[a[i]]=last[a[i]],last[a[i]]=i;pre[i]=pre[i-1]^ha[a[i]];ans+=cnt[pre[i]];cnt[pre[i]]++;}printf("%llu\n",ans);return 0;
}

\(\texttt{solution}~\texttt{2:}\) 扫描线

我们记 \(Pos(i,1/2/3)\) 表示当前右端点以左,离数字 \(i\) 距离第 \(1,2,3\) 远的位置。

易知当左端点位于 \([1,Pos(3)],[Pos(2)+1,Pos(1)]\) 时答案不合法,所有不合法位置的并集就是所有不合法位置。

可以通过总位置减去不合法位置来求出合法位置,因此变成了一道区间染色问题。

我们通常用扫描线(不下传标记)来维护区间是否被染色,这题也可以这么维护。

$\texttt{code}$
#define Maxn 1000005
typedef long long ll;
int n,ans;
int a[Maxn],Last[Maxn][3];
struct TREE{ int laz,sum; }tree[Maxn<<3];
inline void pushup(int p,int nl,int nr)
{if(tree[p].laz>0) tree[p].sum=nr-nl+1;else tree[p].sum=tree[p<<1].sum+tree[p<<1|1].sum;
}
void add(int p,int nl,int nr,int l,int r,int k)
{if(l>r) return;if(nl>=l && nr<=r) { tree[p].laz+=k,pushup(p,nl,nr); return; }int mid=(nl+nr)>>1;if(mid>=l) add(p<<1,nl,mid,l,r,k);if(mid<r) add(p<<1|1,mid+1,nr,l,r,k);pushup(p,nl,nr);
}
int main()
{n=rd();for(int i=1;i<=n;i++) a[i]=rd();for(int i=1;i<=n;i++){add(1,1,n,1,Last[a[i]][2],-1);add(1,1,n,Last[a[i]][1]+1,Last[a[i]][0],-1);Last[a[i]][2]=Last[a[i]][1];Last[a[i]][1]=Last[a[i]][0];Last[a[i]][0]=i;add(1,1,n,1,Last[a[i]][2],1);add(1,1,n,Last[a[i]][1]+1,Last[a[i]][0],1);ans+=i-tree[1].sum;}printf("%d\n",ans);return 0;
}

【做题记录】统计区间(哈希/扫描线)相关推荐

  1. 【做题记录】区间排序—线段树

    1. CF558E A Simple Task 题意: 给定由小写字母组成的字符串 \(s\) 每一次操作如下: \(opt=0\) :将 \([l,r]\) 降序排序 \(opt=1\) :将 \( ...

  2. Regional 做题记录 (50/50)

    写在前面 博主深感自己太弱了QAQ 于是有了一个刷水的想法,Regional的题目还是有很多考查思维的题目,所以这次是乱做50道思考题,可能会顺带做一些水题,这些题的简要题解会写到这篇博文里面,希望能 ...

  3. 退役前的做题记录1.0

    退役前的做题记录1.0 租酥雨最近很懒qwq,具体表现在写题的时候不想发题解了. 但是想想这样也不太好,就决定发个一句话(半句话到几句话不等)题解上来. 2018-09.18-2018-09.28 [ ...

  4. 退役前的做题记录2.0

    退役前的做题记录2.0 最近在刷省选题......大致上是按照省份刷的. 不过上面的题目顺序是按照写题的顺序排列的,所以可能会有点乱哈. [BZOJ2823][AHOI2012]信号塔 最小圆覆盖,随 ...

  5. 退役前的做题记录4.0

    退役前的做题记录4.0 最近主要在LOJ上写题 536. 「LibreOJ Round #6」花札 比较显然的二分图博弈模型,先手必胜当且仅当起始点一定在最大匹配中.连边可以对每种颜色以及数字建一个点 ...

  6. CSDN 第六期编程竞赛做题记录

    CSDN 第六期编程竞赛做题记录 -- CSDN编程竞赛报名地址:https://edu.csdn.net/contest/detail/16 9.18周日闲来无视写一下 csdn 的编程题,每期编程 ...

  7. 退役前的做题记录5.0

    退役前的做题记录5.0 出于某种原因新开了一篇. [CodeChef]Querying on a Grid 对序列建立分治结构,每次处理\((l,mid,r)\)时,以\(mid\)为源点建立最短路树 ...

  8. 2020.7月做题记录

    转眼就到了2020的下半年了-前方仍是一片茫然. 长期计划 prufer 序列 2020.07.02-2020.07.04 Problem Finished P2624 [HNOI2008]明明的烦恼 ...

  9. 2020.9月做题记录

    八月的做题记录因为是暑假所以鸽掉了. 离联赛真的不远了,要继续努力啊qwq- week -1 2020.08.30 2020.08.30 今天考试,修了20+次锅,修的我都没有心情做题了- 然后开始消 ...

  10. 概率期望题(期望 DP)做题记录

    概率期望题(期望 DP)做题记录 P3830 [SHOI2012]随机树 难点在于第二问:生成树的期望深度. 不 wei zhuo 捏,设 \(dp_{i,j}\) 表示已经有了 \(i\) 个叶子结 ...

最新文章

  1. (0061)iOS开发之iPad开发:UISplitViewController分割视图控制器
  2. php的v_PHPV是什么意思
  3. 【PC工具】winrar解压缩装机必备软件,winRAR5.70免费无广告
  4. Java 设计模式之迭代器模式
  5. 使用Google Guava的订购API
  6. C语言 | 语句概述
  7. laravel5.6 mysql_快速入门 |《Laravel 5.6 中文文档 5.6》| Laravel China 社区
  8. 贝佐斯正接受14小时训练 以为周二进行的首次太空飞行做准备
  9. grafana设置Alert阈值和邮件报警
  10. bzoj 3040: 最短路(road)(堆优化dijkstra)
  11. 考勤系统怎样登录服务器,ZKADMS考勤管理系统数据库连接步骤
  12. Bootstrap入门基础(二)
  13. mac安装win10_新款MacBook扩展坞,内置固态硬盘,还能外装WIN10系统
  14. PCB设计中抑制电磁干扰的几个准则及窍门
  15. unity webgl 手机端微信直接打开链接
  16. 电商群雄角逐中国会员经济红利,谁能拔得头筹?
  17. 在线直播|是事实还是贩卖焦虑?IT行业也偏爱“小鲜肉”
  18. You are currently rebasing branch ‘csindex/feature/index_info‘ on ‘d2ef4210a3‘.
  19. 瑞萨E1仿真器(R0E000010KCE00)支持的MCU系列--V850 Family
  20. oracle备份数据库dmp定时,SCO Unix系统下定时备份Oracle数据库dmp文件的设置

热门文章

  1. oracle未找到时区,Oracle ADF 未找到时区错误
  2. python 什么可以作为变量名_为什么强烈禁止开发人员使用isSuccess作为变量名
  3. 服务器自动删文件,服务器定时删除文件工具
  4. hadoop安装详细步骤_推荐一个超详细的Hadoop安装教程,已有32万次阅读
  5. vscode代码运行时间工具_10款实用的VSCode插件提升你的编辑体验 | 第98期
  6. leetcode139. 单词拆分
  7. 敲黑板!vue3重点!一文了解Composition API新特性:ref、toRef、toRefs
  8. [设计模式]命令模式
  9. [剑指offer]面试题18:树的子结构
  10. [剑指offer]面试题7:用两个栈实现队列