其實比賽想到了一部分但是自己不知道怎麼去實現
直接copy隊友的
可以發現,樹的葉子節點肯定是與它的父親節點相匹配的,所以我們深搜一遍,從底層往上去模擬匹配的過程,對於以i為根節點的子樹,我們先將它的子子樹匹配好,如果 與 i 相鄰的兒子節點都有匹配關係,那麼說明 i 節點肯定要跟它的父親節點匹配,如果只剩 1 個點未匹配,那麼就讓他和 i 節點匹配,如果存在多個,那麼肯定不存在解。
最後我們再對根節點任意塗一種顏色,然後根據匹配關係對其他節點依次塗色。
#include#define fi first
#define se second
#define debug cout<<"i am here"
typedef long long ll;
const int maxn=1e5+5,inf=0x3f3f3f3f,mod=1e9+7;
const int eps=1e-6;
int n;
int ans[maxn],match[maxn];
int head[maxn],cnt;
struct edgee[maxn<<1];
void add(int u,int v);
head[u]=cnt;
}void dfs1(int son,int fa)
}}void dfs2(int son,int fa,int cur)else
}}signed main()
dfs1(1,1);
for(int i=1;i<=n;i++)
}dfs2(1,1,1);
for(int i=1;i<=n;i++)
return 0;
}
模擬賽 紅藍牌
題目 明明有n張牌,正面按編號寫有數字1到n 每個數字只出現一次 每張牌的反面根據正面的數字塗上兩種顏色。如果正面的數字是質數,則為紅色,反之為藍色。明明的老師從這n張牌裡選出了一些,按數字從小到大排序後全部反面向上放成一行。他要明明判斷這些牌上的數字。輸入格式 第一行 乙個正整數n,1 n 100...
DP 概率 紅藍球
有 n 個紅球和 m 個藍球,a,b,c 三個人,輪流取球。若 a 取到紅球則 a 勝利,若 b 取到紅球則 b 勝利,c只負責取球搗亂,不參與勝負。若最後全部球取完後 a 沒有拿到紅球,則 b 勝利,求 a 勝利的概率。輸入 m,n 輸出 a 勝利的概率,保留 5 位小數 補零 樣例輸入 3 4 ...
題解 貪玩藍月
題目傳送門 給出一種元素 u,w 表示它的特徵值為 u 戰鬥力為 w 現在給你乙個雙端佇列,維護該元素,支援兩端加點刪點,以及查詢特徵值之和 pmod p 在 l,r 之內的戰鬥力之和最大的子串行。設操作次數為 m 則保證 m le 5 times 10 4,p le 500 因為懶 菜 得 不 一...