洛谷P4887 第十四分塊 前體

2022-05-19 09:41:14 字數 1975 閱讀 7714

題目大意:

給定乙個長度為\(n\)的序列\(a\),\(k\),和\(m\)次詢問。

每次詢問給定區間\([l,r]\),求滿足\(l\leqslant i< j\leqslant r\)且\(\_\_ \text\_ \text (a_i\oplus a_j)=k\)的數對\((i,j)\)的個數。

40mb。

解題思路:

二次離線莫隊lxl黑科技。

對於一次詢問\([l,r]\),我們考慮右端點往右移動一格後變成\([l,r+1]\),多出來的數其實是\(a_\)在\([l,r]\)內的貢獻。

而這個貢獻相當於\(a_\)在\([1,r]\)內的貢獻減去\(a_\)在\([1,l-1]\)內的貢獻。

而\(a_\)在區間\([1,i]\)內的貢獻可以字首和預處理出來,這部分貢獻可以\(o(1)\)計算。

而當右指標移動的時候,左指標不會動,所以\([1,l-1]\)這個區間是不會變的。

設指標\(r\)往右移動到\(r'\),則把\([r+1,r']\)塞進\(v_\)裡去,表示\([1,l-1]\)這段區間對\([r+1,r']\)有貢獻。往左移動同理,記錄一下貢獻的正負即可。

左指標移動的話,則反著再記錄乙個即可。注意右指標移動的時候,左指標沒有動過,而左指標移動的時候,右指標已經移動完了。

而莫隊保證每個指標移動的總距離是\(o(n\sqrt n)\)的,也就是說乙個vector裡存的區間總長是\(o(n\sqrt n)\)的,那麼拿出來暴力計算即可。

要用乙個桶記錄當前狀態,可以做到\(o(\binom)\)插入(插入乙個數,把這個數異或所有合法數的桶都+1),\(o(1)\)查詢。

注意最後得到的結果是與上一次的貢獻差,最後要做乙個字首和。

時間複雜度\(o(n\binom+n\sqrt n)\),常數巨大。空間複雜度\(o(n+m)\)。

c++ code:

#include#include#include#include#include#define lim 16384

#define n 100005

#define reg register

class istream

templateinline istream&operator>>(t&rhs)

}cin;

struct ostream

inline void operator<<(long long d)else

*s++='\n';

}inline ostream&operator<<(const char&c)

inline~ostream()

}cout;

int n,m,k,buc[lim+1],a[n],k[4000],ks;

long long ans[n],out[n],l_r[n],r_l[n];

struct que

for(int i=0;i>a[i];

l_r[i]=buc[a[i]]+l_r[i-1];

reg int j=0;

for(;j+8>q[i].l>>q[q[i].id=i].r;

std::sort(q+1,q+m+1);

q[0].l=1,q[0].r=0;

for(int i=1;i<=m;++i));else

if(now.rpre.l)

l[now.r+1].push_back((node));

}memset(buc,0,sizeof buc);

for(int i=1;i<=n;++i)

}memset(buc,0,sizeof buc);

for(int i=n;i;--i)

}for(int i=1;i<=m;++i)ans[i]+=ans[i-1],out[q[i].id]=ans[i];

for(int i=1;i<=m;++i)cout

}

洛谷 P4887 模板 莫隊二次離線

原題鏈結 給定乙個長度為 n 的序列和乙個常數 k 每次詢問乙個區間 l,r 內,有多少對 i,j 滿足 l leq i,且 a i oplus a j 的二進位制表示下恰好有 k 位為 1 資料範圍 1 leq n,m leq 10 5,0 leq a i 2 0 leq k leq 14 按照普...

P4887 第十四分塊 前體

p4887 第十四分塊 前體 二次離線莫隊。新技能get。用於可以使用莫隊且單次轉移的效率不是 o 1 的情況。對於每次指標移動,先不直接算,而是把詢問差分然後再次離線詢問。這樣可以算出每一問對於上乙個詢問的答案的變化量,最後再重新按末對的順序加起來就可以。include define ll lon...

洛谷P5049 洛谷P5022 題解 旅行

原題 資料加強版 加強版 參考你谷題解 終於調過了 又是一如既往的申必錯誤 noi plus石錘了 原題的資料允許我們 o n 2 暴力斷邊,但是加強版的資料達到了 n log n 級別,我們必須在斷邊這一環節尋求更好的解法。考慮我們進入環後在何處回溯 根據繼續走環走到的點分類 設當前已經從 b 走...