2020多校聯考 樹

2022-03-17 00:57:56 字數 1059 閱讀 7369

(沒有定根就非常的離譜,後來告訴根直接就是 \(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 始終可以並在一起,乾...