送你一朵聖誕樹
題目背景:
1.8 wc
模擬t3
分析:並查集+ 堆
+ 貪心
對於全域性最小的那個點,選擇了它的父親之後,就一定會選擇它,所以我們直接合併它和它的父親,那麼對於乙個點集
i,記錄
ti為點集中的點的個數,
si為點集中的點的權值和,那麼,對於兩個點集,如果點集
i優於點集
j,那麼
ti * sj > tj * si
,那麼si /ti
< sj / tj
,那麼直接並查集
+ 堆,每次合併當前塊和父親的塊就可以了。
source:
/*
created by scarlyw
*/#include #include #include #include #include #include #include #include #include #include #include #include inline char read()
return *s++;
}///*
templateinline void r(t &x)
for (x = 0; isdigit(c); c = read())
x = ((x << 2) + x << 1) + (c ^ '0');
if (iosig) x = -x;
}//*/
const int out_len = 1024 * 1024;
char obuf[out_len], *oh = obuf;
inline void write_char(char c)
templateinline void w(t x)
}inline void flush()
/*templateinline void r(t &x)
//*/
const int maxn = 30000 + 10;
struct node
inline bool operator < (const node &a) const
} ;std::priority_queueq;
std::vectoredge[maxn];
int n, x, y, val;
int w[maxn], deg[maxn], father[maxn], sum[maxn], size[maxn], fa[maxn];
bool able[maxn];
inline void add_edge(int x, int y)
inline void read_in()
inline void dfs(int cur, int fa)
}inline int get_father(int x)
inline void solve()
while (!q.empty())
ans = std::max(ans, ret);
} }std::cout << ans;
}int main()
WC模擬(1 8) T2 送你乙個集合
送你乙個集合 題目背景 1.8 wc 模擬t2 分析 二進位制 第一次做通訊題。最樸素的想法,直接把 x傳回去,這樣顯然不夠優秀,考慮優化一下,顯然x,y至少存在一位 2進製位是不同的,那麼我們只要傳第乙個不同的位置,然後再傳 x在當前位是 0 1,這樣可以在 20以內解決,還是不夠優秀,考慮如何優...
WC模擬(1 12) T3 小C的線段樹
小c的線段樹 題目背景 1.12 wc 模擬t3 分析 dp 據說,這個玩意兒才是本場 t1 考場上只想到乙個 nm2的暴力,就是,直接定義 f i l r 表示當前是第 i個區間,上乙個括號是 l,r 這樣過掉了 k 1 的部分。考慮標算,注意到當 n m 時,是不存在合法操作序列的,所以因為 n...
NOIP模擬(20171024)T3 數學
求滿足方程ax xa mod2n 的解的個數 n 30,a 109詢問組數t 1000 引理一 若a,b 均為奇數,且a2 k 1 b2k 1 mod2n 則a b mod2n 證明 a 2k 1 b2k 1 mod2n a 2k 1 b2k 1 0 mod2n a b a2k a2k 1b a2k...