毒瘤了乙個下午。
首先這個題是裂開的,就算乙個 \(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 同學在題面上黑我的情況表示強烈譴責,將在他不注意的時候實...