有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...