csp模擬 我的訂書機之戀 樹形結構 雜湊

2021-09-29 09:39:25 字數 1363 閱讀 6114

傳送門

事實上標題給的是兩種做法。

正解:乙個合法答案只能是最小答案或者由兩個答案子區間並集構成。(否則肯定會叉出去)

那就有乙個天然樹形結構,用單調棧維護f_r表示右端點r最近的合法答案位置。令r向f_r連邊,l向f_連邊。

(當然,上述連邊是反向的)

倍增lca的深度-2就是答案,記得特判兩個點相同的情況。

#include#define r register

#define ll long long

using namespace std;

const int n = 2100000, inf = 0x3f3f3f3f;

int n, m, a[n], hd[n], to[n], nxt[n], e = 1, fa[n], stck[n], tp, disa[n], dep[n], size[n], top[n];

int s[n], tm[n], tmi[n];

inline void a(int x, int y)

struct io

inline void print(int x)

return;

}void dfs2(int now)

inline int getlca(int x, int y)

int main()

}memset(tmi, 0x3f, sizeof (tmi));

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

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

if (a[i]> i && a[i - 1] < i - 1 && !disa[i - 1])

fa[i] = fa[i - 1];

for (r int i = (n << 1); i; --i)

fa[i+ 1] = disa[i] ? 1 : fa[i]+ 1, a(fa[i+ 1], i+ 1);

fa[1] = 0, dfs1(1), dfs2(1);

while (m--)

++x,++y, lca = getlca(x, y);

print(dep[lca] - 1 - (x == y));

}return 0;

}

法2:

考場想的是法2。因為太菜想不到離散化開桶而寫了40分,因為忘刪除錯語句而爆零了。

直接差分錯誤顯然。故給每個括號乙個不一樣的權值。rand出來(要很大,1e18也有相當的錯誤概率)

當然,如果像我這樣直接相加,很大概率會gg。但使用異或的話,撞車機率就小的多。(2的六十多次方呢)

離散化後從頭掃一遍開桶判即可。

實在寫不動了,咕

csp模擬補題

咕咕東是個貪玩的孩子,有一天,他從上古遺跡中得到了乙個神奇的圓環。這個圓環由字母表組成首尾相接的環,環上有乙個指標,最初指向字母a。咕咕東每次可以順時針或者逆時針旋轉一格。例如,a順時針旋轉到z,逆時針旋轉到b。咕咕東手裡有乙個字串,但是他太笨了,所以他來請求你的幫助,問最少需要轉多少次。解題過程 ...

模擬 我要清晰的Unicode轉碼表

我要清晰的unicode轉碼表 description 據檔案歷史記錄,wx曾經在2008年2月研究過unicode,並嘗試了shift jis gb2312 unicode的相互轉換問題。找資料當然要上官方 於是從unicode.org上down下了官方編碼對映表,不過看似這個表有一些問題,下面就...

csp模擬 模擬測試16

fdasds include using namespace std define cle a memset a,0,sizeof a inline int read const int mod 1e9 7,maxn 1e3 100 int n,m,ans 0 int f maxn maxn int...