【做题记录】统计区间(哈希/扫描线)
交题链接
给你一个长度为 \(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. CF558E A Simple Task 题意: 给定由小写字母组成的字符串 \(s\) 每一次操作如下: \(opt=0\) :将 \([l,r]\) 降序排序 \(opt=1\) :将 \( ...
- Regional 做题记录 (50/50)
写在前面 博主深感自己太弱了QAQ 于是有了一个刷水的想法,Regional的题目还是有很多考查思维的题目,所以这次是乱做50道思考题,可能会顺带做一些水题,这些题的简要题解会写到这篇博文里面,希望能 ...
- 退役前的做题记录1.0
退役前的做题记录1.0 租酥雨最近很懒qwq,具体表现在写题的时候不想发题解了. 但是想想这样也不太好,就决定发个一句话(半句话到几句话不等)题解上来. 2018-09.18-2018-09.28 [ ...
- 退役前的做题记录2.0
退役前的做题记录2.0 最近在刷省选题......大致上是按照省份刷的. 不过上面的题目顺序是按照写题的顺序排列的,所以可能会有点乱哈. [BZOJ2823][AHOI2012]信号塔 最小圆覆盖,随 ...
- 退役前的做题记录4.0
退役前的做题记录4.0 最近主要在LOJ上写题 536. 「LibreOJ Round #6」花札 比较显然的二分图博弈模型,先手必胜当且仅当起始点一定在最大匹配中.连边可以对每种颜色以及数字建一个点 ...
- CSDN 第六期编程竞赛做题记录
CSDN 第六期编程竞赛做题记录 -- CSDN编程竞赛报名地址:https://edu.csdn.net/contest/detail/16 9.18周日闲来无视写一下 csdn 的编程题,每期编程 ...
- 退役前的做题记录5.0
退役前的做题记录5.0 出于某种原因新开了一篇. [CodeChef]Querying on a Grid 对序列建立分治结构,每次处理\((l,mid,r)\)时,以\(mid\)为源点建立最短路树 ...
- 2020.7月做题记录
转眼就到了2020的下半年了-前方仍是一片茫然. 长期计划 prufer 序列 2020.07.02-2020.07.04 Problem Finished P2624 [HNOI2008]明明的烦恼 ...
- 2020.9月做题记录
八月的做题记录因为是暑假所以鸽掉了. 离联赛真的不远了,要继续努力啊qwq- week -1 2020.08.30 2020.08.30 今天考试,修了20+次锅,修的我都没有心情做题了- 然后开始消 ...
- 概率期望题(期望 DP)做题记录
概率期望题(期望 DP)做题记录 P3830 [SHOI2012]随机树 难点在于第二问:生成树的期望深度. 不 wei zhuo 捏,设 \(dp_{i,j}\) 表示已经有了 \(i\) 个叶子结 ...
最新文章
- (0061)iOS开发之iPad开发:UISplitViewController分割视图控制器
- php的v_PHPV是什么意思
- 【PC工具】winrar解压缩装机必备软件,winRAR5.70免费无广告
- Java 设计模式之迭代器模式
- 使用Google Guava的订购API
- C语言 | 语句概述
- laravel5.6 mysql_快速入门 |《Laravel 5.6 中文文档 5.6》| Laravel China 社区
- 贝佐斯正接受14小时训练 以为周二进行的首次太空飞行做准备
- grafana设置Alert阈值和邮件报警
- bzoj 3040: 最短路(road)(堆优化dijkstra)
- 考勤系统怎样登录服务器,ZKADMS考勤管理系统数据库连接步骤
- Bootstrap入门基础(二)
- mac安装win10_新款MacBook扩展坞,内置固态硬盘,还能外装WIN10系统
- PCB设计中抑制电磁干扰的几个准则及窍门
- unity webgl 手机端微信直接打开链接
- 电商群雄角逐中国会员经济红利,谁能拔得头筹?
- 在线直播|是事实还是贩卖焦虑?IT行业也偏爱“小鲜肉”
- You are currently rebasing branch ‘csindex/feature/index_info‘ on ‘d2ef4210a3‘.
- 瑞萨E1仿真器(R0E000010KCE00)支持的MCU系列--V850 Family
- oracle备份数据库dmp定时,SCO Unix系统下定时备份Oracle数据库dmp文件的设置
热门文章
- oracle未找到时区,Oracle ADF 未找到时区错误
- python 什么可以作为变量名_为什么强烈禁止开发人员使用isSuccess作为变量名
- 服务器自动删文件,服务器定时删除文件工具
- hadoop安装详细步骤_推荐一个超详细的Hadoop安装教程,已有32万次阅读
- vscode代码运行时间工具_10款实用的VSCode插件提升你的编辑体验 | 第98期
- leetcode139. 单词拆分
- 敲黑板!vue3重点!一文了解Composition API新特性:ref、toRef、toRefs
- [设计模式]命令模式
- [剑指offer]面试题18:树的子结构
- [剑指offer]面试题7:用两个栈实现队列