題解 AHOI HNOI2017 影魔

2022-09-19 07:18:08 字數 2269 閱讀 1221

毒瘤了乙個下午。

首先這個題是裂開的,就算乙個 \(p_1\) 和 \(p_2\) 的係數就好了。

先轉化一下題意,設區間 \((i, j)\) 中的最大值為 \(m_\) 。

那麼 \(p_1\) 的係數就是滿足 \(m_ \le \min\\) 的 \((i, j)\) 點對的個數,\(p_2\) 的係數就是滿足 \(\min\ < m_ < \max\\) 的點對個數。

然後這個第乙個子任務是沒有意義的,然後考慮乙個 \(\mathcal o(n\times m)\) 的演算法。

列舉右端點求出左端點的個數,由於你做過數區間而且有關最大最小值的題,你掏出來乙個單調棧 \(stk\) 。

然後罰坐了半個小時, 你有一些驚世駭俗的發現(先很自然地把原來的序列轉化為一堆形如 \((i, k_i)\) 的點):

右邊的這個紅點是新加入的,橙色的框住的是將要被刪去的單調棧的節點。

這些節點(線段)的最右端點就是最大值。

那麼能和這個新節點形成 \(p_1\) 係數的節點就是圖上標出的橙色節點,能成為 \(p_2\) 係數的就是這些綠色的部分以及藍框內單調棧節點的最右端點。

最激動人心的是由於單調棧刪去和加入節點的複雜度,使得這樣的計算只是 \(\mathcal o (n)\) 級別的。

然後就能獲得和暴力分一樣的好成績。

但是到了這個程度,就有想法了,你可以將所有這些花花綠綠的點對應到線段樹下標上,然後列舉右端點,如果是 \(p_i\) 的係數就賦上 \(p_i\) 。

那麼先把所有在單調棧裡面的節點賦上 \(p_2\),總體的複雜度就是乙個 \(\log\) 的。

但是現在求的不是對於每個右端點的權值總和,而是乙個區間,所以乙個主席樹就解決了。

#include #define forn(i,s,t) for(int i = (s); i <= (t); ++i)

#define form(i,s,t) for(int i = (s); i >= (t); --i)

#define rep(i,s,t) for(int i = (s); i < (t); ++i)

using namespace std;

typedef long long i64;

const int n = 2e5 + 5;

int n, m, p[n]; i64 p1, p2;

namespace sub1

cout << ans1 * p1 + ans2 * p2 << '\n';

} inline void solve() }}

namespace sub2

inline void opts(int p, i64 k)

inline void optt(int p, i64 k, i64 t)

inline void down(int p)

void bld(int& p, int l, int r)

void upds(int p, int l, int r, int nl, int nr, i64 k)

i64 qry(int p, int l, int r, int nl, int nr)

} zt;

struct seg

seg(int _d, int _l, int _r) : id(_d), l(_l), r(_r) {}

inline void rdn(int i)

inline friend bool operator < (const seg& a, const seg& b)

} s[n];

int stk[n], top; basic_stringo; i64 ans[n];

inline void solve()

zt.optt(rt, 1, 0);

if (o[0]) zt.upds(rt, o[0], o[0], 1, n, p2 - p1);

rep (i, 1, o.size())

stk[++top] = r; zt.upds(rt, r, r, 1, n, p2);

while (now <= m && s[now].r == r) ans[s[now].id] = zt.qry(rt, s[now].l, s[now].r, 1, n), now ++ ;

} forn (i, 1, m) cout << ans[i] << '\n'; }}

int main()

AHOI HNOI2017 影魔 題解

傳送門qaq 首先有乙個套路 我自己總結的,錯了別罵窩 qwq 統計滿足類似 i lt j lt k 且 a i lt a j lt a k 的關係的 i,j,k 數量的這類題一般來說突破點都是中間的 j 並且一般會採用單調棧處理。這道題的預處理就是這個套路 首先對於每個 i 求出左邊離 i 最近的...

影廳選座 題解

前兩天我和同學們去上海的比賽做了做題 同行切磋 發現自己實力著實不夠啊,人家認為難度正常的題我有一半沒做出來。我先說丙組的題吧,這是最後一題,最難的乙個,有好多人不會,我也算幫幫那些不會的人。這個問題我用了乙個神奇的演算法 二維字首和。這個演算法和字首和有異曲同工之妙 他倆就是差了個維度 我們先設定...

2017校賽題解

又是一年一度的校賽,三個人從出題到準備環境花了好幾天的時間。雖然也是蠻累的,期間出了一些小差錯,但總的來說還是蠻成功的 感覺比去年好一些,逃。一共出了7題,但是考慮到比賽時間比較緊張就砍掉了兩題 反正沒砍我的題,對了,關於 teddywang 同學在題面上黑我的情況表示強烈譴責,將在他不注意的時候實...