SDOI2011 消耗戰 虛樹

2021-10-02 20:27:21 字數 1999 閱讀 5086

有m次詢問,又有詢問的總的點數之和是小於等於5e5的,所以,其實就是乙個虛樹的模板了,直接用棧維護乙個虛樹即可。

期間寫的時候出現了一點問題:初始化的時候,不只是要初始那些輸入的k個結點,還有k個結點的lca的衍生結點也是需要初始化的,所以初始化不到位會mle和tle的,這裡不要忘。

#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 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

using namespace std;

typedef unsigned long long ull;

typedef unsigned int uit;

typedef long long ll;

const int maxn = 250007;

int n, q, qid[maxn << 1], log2[maxn];

struct build_graph

}edge[maxn << 1];

inline void addeddge(int u, int v, int w)

inline void _add(int u, int v, int w)

inline void init()

} old, now;

int dfn[maxn], tot, deep[maxn], fa[maxn][19];

inline bool cmp(int e1, int e2)

ll up_toroot[maxn] = ;

void pre_dfs(int u, int father)

}inline int lca(int u, int v)

if(u == v) return u;

for(int i=log2[n]; i>=0; i--)

}return fa[u][0];

}int stap[maxn << 1], stop;

inline void insert(int u)

if(u == stap[stop]) return;

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

if(lca == stap[stop])

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

if(lca ^ stap[stop])

stap[++stop] = u;

}bool used[maxn];

ll dp[maxn];

ll dfs(int u)

if(used[u]) dp[u] = up_toroot[u];

now.head[u] = -1;

return dp[u];

}inline void init()

log2[i] = k;

}}int main()

printf("%lld\n", dfs(1));

for(int i=1; i<=sz; i++) used[qid[i]] = false;

}return 0;

}

SDOI2011 消耗戰 (虛樹)

題意 給一棵n個頂點的樹,每條樹邊有邊權。m次詢問,每次詢問給出k個點,問使得這k個點均不與1號點 根節點 相連的最小代價 解法 虛樹用法 在單次詢問只涉及樹中少量節點時,可以建立一顆只包含關鍵節點的樹 將無用節點組成的鏈簡化為邊或者刪掉,形成虛樹,最後在虛樹上進行dp 關鍵點為詢問點和lca 虛數...

虛樹 sdoi2011《消耗戰》

卡著時間過得,大概是因為全用了ll,時間漲了一倍吧?懶得改了,第一道虛樹還是思路比較重要 下面這段文字是複製來的 給出一棵樹.每次詢問選擇一些點,求一些東西.這些東西的特點是,許多未選擇的點可以通過某種方式剔除而不影響最終結果.於是就有了建虛樹這個技巧.我們可以用log級別的時間求出點對間的lca....

SDOI2011 消耗戰 虛樹 樹形動規)

虛樹的主要思想 所以怎麼辦 q.clear int m scanf d m for int i 1 i m i sort q.begin q.end cmp for int i 0 iq是乙個vector,我們開始先對所有節點按尤拉序 即深度優先搜尋是訪問的順序 排序,然後對每兩個相鄰的節點將lca...