一開始的時候,我往長鏈剖分上去寫,但是寫不好,最後寫成了當只有一條鏈的時候是
然後,開始想別的想法了,於是想(**)到了虛樹的做法。
因為,我們可以發現,乙個點,向上影響的時候,只有同等深度的才會同時起作用,只要不是同等深度的時候,那麼他們的時間就會是錯開的,所以,我們可以對深度來進行處理。
只有發生這種情況的時候,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。遊戲規則很簡單 從起點出發,每步操作可以移動到上 下 左 右四個方向的空地上,直到終點。為了增加遊戲的難度,在這個遊戲中,從起點到終點並不一...