Solution WC 2022 禿子酋長

2022-09-19 15:51:10 字數 3384 閱讀 9423

link. (it's empty temporarily.)

給定排列 \(\\),\(q\) 次詢問,每次給出 \([l,r]\),求公升序列舉 \(a_\) 時下標的移動距離。

\(n,q\le5\times10^5\)。

我寫了個不加莫隊,它慢死了。

我寫了個 ynoi 風格的純純分塊預處理,它慢死了。

我寫了個 polylog 的正解,它還是慢死了。

喵樹分治,每次處理跨過區間中點的詢問。左右區間互相的影響形式形如:「若右區間包含乙個 \([x,y]\) 內的數,則答案變化量為 \(\delta\)。」注意左右區間包含了哪些數僅跟乙個端點有關,所以類似於區間數點的形式,可以考慮離線維護。

以計算左區間產生的 \(\delta\) 為例。列舉左區間端點 \(p=\textit..l\),用std::set之類的東西暴力維護左區間前驅後繼。現在加入 \(a_p\),設其前驅為 \(x\),後繼為 \(y\),內部貢獻先計算;對於跨區間影響,我們得到了兩個新的「連續鍵」 \(x\rightarrow a_p\) 以及 \(a_p\rightarrow y\),去掉了乙個舊的「連續鍵」 \(x\rightarrow y\),而我們可以分別找到右區間第乙個能「斷鍵」的數的位置 \(k\),把對應的變化量掛在 \(k\) 位置。然後列舉左端點為 \(p\) 的詢問,將詢問對應的右端點及其左側的所有「斷鍵」變化量都計入詢問答案。右區間也做類似的事情即可。

複雜度是 \(\mathcal o(n\log^2 n)\),隱約記得 lxl 說有基於並查集的低於這一複雜度的做法?

那個線段樹可以替換成離線啊,怪不得那麼慢 qwq。

/*+rainybunny+*/

#include #define rep(i, l, r) for (int i = l, rep##i = r; i <= rep##i; ++i)

#define per(i, r, l) for (int i = r, per##i = l; i >= per##i; --i)

typedef long long ll;

typedef std::pairpii;

#define fi first

#define se second

inline char fgc()

template inline tp rint()

template inline void wint(tp x)

inline int iabs(const int u)

template inline void chkmin(tp& u, const tp& v)

template inline void chkmax(tp& u, const tp& v)

template inline tp imin(const tp& u, const tp& v)

template inline tp imax(const tp& u, const tp& v)

const int maxn = 5e5, iinf = 0x3f3f3f3f;

int n, q, a[maxn + 5], ref[maxn + 5];

ll ans[maxn + 5];

struct query ;

std::vectorask[maxn * 2 + 5];

struct segmenttree

inline void modify(const int u, const int l, const int r,

const int x, const int v)

int mid = l + r >> 1;

if (x <= mid) modify(u << 1, l, mid, x, v);

else modify(u << 1 | 1, mid + 1, r, x, v);

mn[u] = imin(mn[u << 1], mn[u << 1 | 1]);

mx[u] = imax(mx[u << 1], mx[u << 1 | 1]);

}inline int qmin(const int u, const int l, const int r,

const int ql, const int qr)

inline int qmax(const int u, const int l, const int r,

const int ql, const int qr)

} sgt;

struct bit

}inline ll sum(int x)

inline void restore()

}} bit;

#define tid(l, r) (l + r | (l != r))

inline void hang(const int l, const int r, const query& qr)

inline void solve(const int l, const int r) ;

};auto bondl = [&](const int x, const int y, const int op)->void ;

bit.restore(), st.clear(), curs = 0;

rep (i, mid + 1, r) sgt.modify(1, 1, n, a[i], i);

std::sort(qvec.begin(), qvec.end(),

(const query& u, const query& v) );

for (int i = mid, j = 0; i >= l && j != qvec.size(); --i)

}rep (i, mid + 1, r) sgt.modify(1, 1, n, a[i], 0);

auto bondr = [&](const int x, const int y, const int op)->void ;

bit.restore(), st.clear(), curs = 0;

rep (i, l, mid) sgt.modify(1, 1, n, a[i], i);

std::sort(qvec.begin(), qvec.end(),

(const query& u, const query& v) );

for (int i = mid + 1, j = 0; i <= r && j != qvec.size(); ++i)

}rep (i, l, mid) sgt.modify(1, 1, n, a[i], 0);

}int main() );

}sgt.build(1, 1, n), solve(1, n);

rep (i, 1, q) wint(ans[i]), putchar('\n');

return 0;

}

2 02 理解查詢模型

示例 select name from users where age 10 可以形象的看作是下面這樣 let arr let users users.foreach item 是指列與列之間進行運算得出的結果,叫做廣義投影 因為null 表達的意思是 空 null null false null ...

CI20 2 洗牌演算法

實現乙個方法,對一副牌 52張 進行洗牌,要求洗出的52 組合是的等概率的,即每種組合的概率為1 52 假設已經有乙個完美的隨機數生成器。思路 思路比較直觀,第一次從52張牌中隨機取一張出來,概率為1 52 第二次從剩下的51張隨機取一張出來,概率為1 51 以此類推最終的概率就是1 52 接下來是...

axp202電源管理

問題 充電電流被限制,導致充電時間過長。版本分支 android4.3 master 復現問題,檢測電流變化,發現機器在深度休眠後電流會由原來的1.2a變成0.5a。猜測 可能是由於充電電流過小導致充電時間過長。echo 30 sys class axppower axpreg cat sys cl...