(沒有定根就非常的離譜,後來告訴根直接就是 \(1\))
先考慮鏈上怎麼做,顯然維護乙個單調棧,求出第乙個比當前數大的位置,然後倍增即可。再放在樹上怎麼做?依舊維護單調棧,但這次不能暴力地彈掉棧頂元素了,因為這樣的複雜度是假的。因為單調棧有單調性,所以直接在單調棧內二分出單調棧彈得不能再彈的位置,然後修改 \(top\),繼承答案。搜尋回溯的時候再將棧還原即可。對於詢問從 \(u\) 到 \(v\) 初始智商為 \(w\) 能學習多少次,因只要 \(pre[u][j]\) 這個人的智商小於等於 \(w\) 就不會產生貢獻,所以直接倍增地把這些點都跳過。最後不能跳了,跳到了 \(u'\)。那麼 \(pre[u'][0]\) 這個點智商一定比 \(w\) 大,從這個點之後就會產生貢獻了。然後再次倍增,只要還在 \(v\) 的子樹裡。
#include#includeusing namespace std;
#define n 100007
inline int read()
while(c>='0'&&c<='9')
return flag? x:-x;
}struct ee[n<<1];
int head[n],cnt=0;
inline void add(int id,int to);
head[id]=cnt;
}int sta[n],top=0,w[n],n,q;
int pre[n][18],dep[n],ans[n];
inline bool cmp(int x,int y)
void dfs(int u,int fa_u)
top=lt,sta[lpos]=lw;
}int main()
dep[1]=1,dfs(1,0);
while(q--)
if(dep[u]=dep[v]) u=pre[u][i];
printf("%d\n",1+ans[tmp]-ans[u]);}}
}
2020多校聯考 手套
有兩個可重集 a 和 b 每個集合裡有若干元素,每種元素有若干個。可以選擇從 a 集中等概率隨機選 x 個到 c 集 從 b 中等概率隨機選擇 y 個到 d 使得一定會使 c 和 d 有交。最小化 x y 在 x y 相等時最小化 x 因為要使得一定有交,所以考慮選了一定數目後,沒有交的最壞情況。最...
2020多校聯考 簡單題
確實是簡單題。邊權和最小顯然是最小生成樹。對於一條非樹邊,加到樹裡面一定會構成乙個環,那麼環上的樹邊的邊權就一定不能超過這條非樹邊。所以對最小生成樹進行重鏈剖分,對於一條非樹邊 u i,v i 對鏈 u i to v i 進行 modify 維護乙個最小值。而對於一條非樹邊要想成為樹邊,就至少需要把...
2020多校聯考 簡單題
2020.11.23 題目只要求求出 c 的值,它就提示我們 c 和 a b 的值沒有太大關係。照著這個思路我們把 a b 合併一下,搞成二元組。對 a b leq c a b,c to 2 a b c a b 對 a b c a b,c to a b c,2c 我們發現 ab 始終可以並在一起,乾...