【做题记录】统计区间(哈希/扫描线)
生活随笔
收集整理的這篇文章主要介紹了
【做题记录】统计区间(哈希/扫描线)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
交題鏈接
給你一個長度為 \(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; }總結
以上是生活随笔為你收集整理的【做题记录】统计区间(哈希/扫描线)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 血滴子是什么东西 血滴子解释
- 下一篇: 七夕祝福语简短一句话