血壓遊戲 科大訊飛杯G題 虛樹

2021-10-05 06:53:40 字數 2615 閱讀 5912

一開始的時候,我往長鏈剖分上去寫,但是寫不好,最後寫成了當只有一條鏈的時候是

然後,開始想別的想法了,於是想(**)到了虛樹的做法。

因為,我們可以發現,乙個點,向上影響的時候,只有同等深度的才會同時起作用,只要不是同等深度的時候,那麼他們的時間就會是錯開的,所以,我們可以對深度來進行處理。

只有發生這種情況的時候,x和y才會同時影響乙個結點,不然的話,在相互不影響的直接向上路徑上的產生的貢獻就是:

這裡的而,有多個點會同時抵達u點的時候,又是怎樣的一種情況呢?

如圖,我們假設前面已經計算過了前面所有該時刻到達u點的值,現在算v點,那麼就應該是

那麼,我們這樣子算出了到達各個點的同一時刻上的松鼠的數量,那麼時刻實際上就是與深度有關的,所以,我們用乙個vector儲存深度,然後每次處理同一深度到達s點時候所能送來的松鼠的數量,就是變相的求出了每個時刻到s點的松鼠數量了。

於是,我們可以用虛樹來解決這個問題了,別忘了最開始的時候就要往棧中push進去s結點,為了方便計算。

然後,虛樹的複雜度為

我這裡用了尤拉序+rmq求lca的方式,因為這樣預處理時候是

#include #include #include #include #include #include #include #include #include #include #include #include #include //#include //#include #define lowbit(x) ( x&(-x) )

#define pi 3.141592653589793

#define e 2.718281828459045

#define inf 0x3f3f3f3f

#define big_inf 0x3f3f3f3f3f3f3f3f

#define eps 1e-8

#define half (l + r)>>1

#define lsn rt<<1

#define rsn rt<<1|1

#define lson lsn, l, mid

#define rson rsn, mid+1, r

#define ql lson, ql, qr

#define qr rson, ql, qr

#define myself rt, l, r

#define mp(a, b) make_pair(a, b)

using namespace std;

typedef unsigned long long ull;

typedef unsigned int uit;

typedef long long ll;

const int maxn = 2e5 + 7;

int n, s, log_2[maxn << 1], _up;

ll a[maxn], ans = 0;

struct graph

} edge[maxn << 1];

inline void addeddge(int u, int v)

inline void _add(int u, int v)

void clear()

} old, now;

vectorvt[maxn];

struct grand_father

euler[++esiz] = u;

}int mn[maxn << 1][20];

inline void rmq_init()}}

inline int rmq(int l, int r)

inline int _lca(int u, int v)

} a_lca;

inline bool cmp(int e1, int e2)

int stap[maxn], stop;

ll dp[maxn];

inline void insert(int u)

int lca = a_lca._lca(u, stap[stop]);

while(stop > 1 && a_lca.dfn[lca] <= a_lca.dfn[stap[stop - 1]])

if(lca ^ stap[stop])

stap[++stop] = u;

}inline void init()

log_2[i] = k;

}}int main()

if(dp[s]) ans += max(1ll, dp[s] - 1);

}if(a[s]) ans += max(1ll, a[s] - 1);

printf("%lld\n", ans);

return 0;

}

牛客 科大訊飛杯 G題血壓遊戲(虛樹 dp)

題意很好理解。而且很容易發現樹中同一深度的松鼠才會打架。預處理出節點的深度和dfs序,然後列舉樹的深度,同一深度的所有節點和根節點s去建虛樹,每建好一次就從根節點s出發跑一次樹型dp dp的轉移方程比較好想,設當前節點為x,si為x的子樹,則dp x max 1,dp si depth si dep...

科大訊飛杯 A 張老師和菜哭武的遊戲

官方題解 其中p xa yb是因為 剛開始遊戲時只有兩個數 乙個a 乙個b 如果遊戲繼續下去 又會挑選下乙個數 要麼是 a b 要麼是a b 或者b a b a 如果我們令下乙個數c a b或者b a 那麼如果遊戲繼續 下乙個要挑選的數就是 c a a c b c c b這幾種情況 如果把c用前面的...

迷宮 科大訊飛杯K題 BFS 單調佇列 單調棧

supersodasea 在玩乙個走迷宮的遊戲。迷宮是乙個大小為 n m的矩陣,從上到下依次給行編號為 0,1,n 1,從左到右依次給列編號為 0,1,m 1。遊戲規則很簡單 從起點出發,每步操作可以移動到上 下 左 右四個方向的空地上,直到終點。為了增加遊戲的難度,在這個遊戲中,從起點到終點並不一...