剛開始看起來像樹形dp,卻感覺無從下手(其實正解是fft)
每個值的排名往上回溯時都會改變,後效性滿滿的。根本不是一次樹形dp能解決的。
那麼,每個值對其他值的排名有什麼影響呢?我們發現只有比val[i]大的值才會影響它的排名。
不妨每次取乙個點出來,令值大於改點的值變為1,小於改點的值變為0,
問題就轉化為了求一顆樹上含根的總值小於k的連通塊的個數了。
而此時求出的個數,就是該店作為第k大點的次數了。
令f[rt][i][j]代表以rt為根,i的子樹中值等於j且包含j的連通塊的個數。
答案就為 ∑ f[rt][rt][k]*val[rt] (1<=rt<=n) 了。
由於val值有重複,為了不計算重複,我們將val值排序,取排名就行了。
**:
//#pragma g++ optimize(2)
//#pragma gcc optimize(2)
#include#include#include#include#include#include#include#include#include#include#include#define ll long long
#define o4 inline
using namespace std;
const int n=1667;
int n,m,a,b,c,d,e,limit;
o4 int read()
while(t>='0'&&t<='9')
return u*k;
}struct sssa[n];
int maxx[n],val[n],rank;
int f[n][n];
ll g[n],ans;
vector map[n];
inline void m(ll &u)
void dp(int now,int fa)
{ f[now][val[now]]=1;
for(int i=0;i其實還有更優秀的**
九省聯考 2018 秘密襲擊
題意 給定一顆含 n 個結點的樹,每個點有點權 d i 求所有聯通塊中第 k 大之和。1 leq n,m,k leq 1666,1 leq d i leq m 時間限制 5 秒。題解一道很有趣的題目。做法簡述 由於 dp 為卷積形式對其多項式求點值,並通過類似整體 dp 的方式維護變換,再通過拉格朗...
題解 九省聯考 2018 秘密襲擊 coat
可以將危險程度轉化為 列舉權值 t in 1,w 如果某個連通塊權值不小於 t 的節點個數不小於 k 個那麼造成 1 的貢獻。考慮 dp 令 f 表示以 u 為根子樹中包含 u 的連通塊,有 j 個權值不小於 i 的節點的方案數。轉移就是前兩維列舉,第三維做揹包。不妨令 f z sum limits...
loj 2473 九省聯考 2018 秘密襲擊
給出一棵樹,每個節點有乙個權值。問所有連通塊中第k大元素的和模64123。設最權值為w,n 1666,w 1666 這一題正解有那麼長!標程也是有那麼長!肝了好久肝不動果斷轉暴力 include using namespace std const int n 1710,mod 64123 int i...