傳送門
事實上標題給的是兩種做法。
正解:乙個合法答案只能是最小答案或者由兩個答案子區間並集構成。(否則肯定會叉出去)
那就有乙個天然樹形結構,用單調棧維護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...