gdsoi2018 day3 誰是冠軍

2021-08-19 19:15:35 字數 1327 閱讀 2684

不說。

如果x能勝y,則x往y連一條邊。

如果乙個點能夠遍歷所有的點,顯然它就是可以的。

用tarjan縮一下強聯通分量,入度為0的那個分量就是答案。

這樣就有60分。

用主席樹優化一下連邊。

大概是線段樹區間會下放到log個完整區間,直接往那些區間連邊。

那些區間往包含的點連邊。

注意插入有時效性,所以要用主席樹的那種思想,新開點。

#include

#include

#define fo(i, x, y) for(int i = x; i <= y; i ++)

#define min(a, b) ((a) < (b) ? (a) : (b))

using namespace std;

const int n = 1e5 + 5, m = 1e7 + 2e6, d = 6e6;

int n, td, c[n], d[m];

struct node a[n];

int c1(node a, node b)

int c2(node a, node b)

int c3(node a, node b)

int final[d], next[m], to[m], tot, rt;

void link(int

x, int

y) int pl, pr, px;

struct tree t[d];

void fi(int &i, int

x, int

y) int

m = x + y >> 1;

fi(t[i].l, x, m); fi(t[i].r, m + 1, y);

}void add(int &i, int

x, int

y) void gg()

}int win(int i, int j)

int dfn[d], low[d], tt, fa[d], tf, bd[d];

int zx[m], zi[m], z0;

bool bz[m];

void dg(int

x) else

}if(ti) continue;

if(dfn[x] == low[x]) while(d[d[0] --] != x);

}} else else

}if(ti) continue;

if(dfn[x] == low[x]) while(d[d[0] --] != x);}}

z0 --;

}}int main()

XSY2892 GDSOI2018 誰是冠軍

為什麼noi模擬賽裡會做到省選原題啊 有n個人,簡單起見把他們編號為1到n,每個人有三項指標分別是攻擊力,防禦力和血量。現在要進行n 1場比賽,每次在剩下的人裡面隨機地選出兩個人進行比賽,當乙個人有大於等於兩項指標嚴格大於另乙個人時,這個人獲得勝利。每次比賽,勝者留下,敗者淘汰。現在請你求出所有可能...

雅禮 noip2018 模擬賽 day3 T3

典型樹形dp 這裡,我們應該看到一些基本性質 如果這個邊不能改 不是沒有必要改 我們就不改,因為就算改過去還要改回來,顯然不是最優的 注意 不能改 是指邊的性質和要求的相同而不包括對邊的顏色沒有要求的情況!如果我們每翻轉一條邊,就認為將這條邊的兩個端點度數 1,那麼不難看到,最後翻轉的所有邊構成的路...

雅禮 noip2018 模擬賽day3 T2

典型的狀壓思想 設0表示黑球,1表示白球,用一串01序列代表剩下的球的狀態,記f i 表示在i狀態下取球的最大期望 那麼可以利用記憶化搜尋更新,每一層列舉可能拿走的球然後向下搜尋,同時記憶化即可 在狀態中刪去乙個點可以利用位運算實現 同時要注意乙個問題,就是狀態0010和狀態010並不是相同的狀態,...