九省聯考 秘密襲擊

2021-08-19 11:35:45 字數 1453 閱讀 3348

剛開始看起來像樹形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...