SDOI2018 戰略遊戲 廣義圓方樹 虛樹

2021-10-02 23:31:05 字數 2275 閱讀 7598

很容易發現一點,題目要我們求的實際上就是我們的新構的樹中的,圓點的個數,所以呢,在這裡我們可以直接通過先利用廣義圓方樹來再求乙個虛樹,我們直接查詢虛樹就可以完成這個要求了。

#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 = 2e5 + 7;

int n, m, q, log2[maxn];

struct graph

} edge[maxn << 2];

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

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

inline void init()

} old, now;

struct tarjan_struct

while(v ^ p);

now._add(u, bcnt + n, 0);

}low[u] = min(low[u], low[v]);

}else low[u] = min(low[u], dfn[v]);}}

inline void clear()

} tj;

struct pre_build_graph

}void clear()

} pbg;

inline int _lca(int u, int v)

if(u == v) return u;

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

}return pbg.root[u][0];

}inline bool cmp(int e1, int e2)

int ans_sum, qid[maxn], stk[maxn], stp;

bool used[maxn] = ;

inline void insert(int u)

int lca = _lca(u, stk[stp]);

if(lca == stk[stp])

while(stp > 1 && pbg.dfn[lca] <= pbg.dfn[stk[stp - 1]])

if(lca ^ stk[stp])

stk[++stp] = u;

}inline void init()

int main()

log2[i] = k;

}int t; scanf("%d", &t);

while(t--)

tj.tarjan(1, 0);

pbg.pre_dfs(1, 0);

scanf("%d", &q);

int sz;

while(q--)

sort(qid + 1, qid + sz + 1, cmp);

stp = 0; ans_sum = 0;

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

while(stp > 1)

if(!used[stk[stp]] && stk[stp] <= n) ans_sum++;

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

printf("%d\n", ans_sum);}}

return 0;

}

SDOI2018 戰略遊戲

給定一張 n 個點 m 條邊的無向聯通圖,共有 q 次操作,每次操作選擇一些點作為關鍵點,詢問有多少個點滿足刪去該點及與其相鄰的邊後,至少有兩個關鍵點不能互相到達。n,q leq 10 5,m leq 2 cdot 10 5,sum s leq 2 cdot 10 5 還是挺簡單的。就是圓方樹 虛樹...

SDOI2018 戰略遊戲

題目 圓方樹其實並沒有那麼難 圓方樹的構建比較簡單,就是乙個tarjan把點雙跑出來,對於每乙個點雙我們多建乙個方點,把原圖中的點稱為圓點,將點雙內所有圓點向方點連邊,之後我們就得到了原圖的圓方樹 關於圓方樹的性質,zyb大爺在他的題解裡寫了很多,這裡就不再抄一遍了 至於這道題,就是把圓點拿出來建棵...

SDOI2018 戰略遊戲

time limit 30 sec memory limit 512 mb submit 12 solved 9 submit status discuss 省選臨近,放飛自我的小q無心刷題,於是慫恿小c和他一起頹廢,玩起了一款戰略遊戲。這款戰略遊戲的地圖由n個城市以及m條連線這些城市的雙向道路構成...