洛谷P1197 JSOI2008 星球大戰

2021-08-09 16:27:37 字數 1325 閱讀 5756

思路

首先動態求割點會tle,考慮倒序離線操作。

當所有打擊完成後,tarjin統計同一連通分量上的點,並查集維護連通性(實際上來說只要兩點之間有邊則將之合併即可tarjin處理麻煩反而會mle?..不清楚為什麼)。再依次將被毀滅的星球復原,則對答案的影響只與當前星球連線的星球數量(及連通關係)有關,每次統計當前連通塊個數。

總而言之寫麻煩了…

#include

#include

#include

#include

#include

using

namespace

std;

int n,m,tot,cnt,num,root,ru,rv,k,sum;

int first[500010],nxt[500010],dfn[200010],low[200010],sccno[200010],stak[500010],fa[200010],xs[200010],scc[200010],ans[200010];

bool cut[200010],b[200010];

struct edge

l[500010];

int find(int x)

void build(int f,int t)

; nxt[tot]=first[f];

first[f]=tot;

}void dfs(int k)

else

if(!sccno[x])

low[k]=min(low[k],dfn[x]);

}if(low[k]==dfn[k])

}}int main()

scanf("%d",&k);

for(int i=1;i<=k;i++)

for(int i=0;i<=n-1;i++)

fa[i]=i;

tot=0;

for(int i=0;i<=n-1;i++)

sum=cnt;

num=0;

for(int i=k;i>=1;i--)//打擊完成後倒序處理

}for(int i=1;i<=tot;i++)

fa[scc[i]]=h,scc[i]=0;

cnt=cnt-tot+1;//+1為加上h點

ans[++num]=cnt;//統計當前答案

}for(int i=num;i>=1;i--)//轉正序輸出

printf("%d\n",ans[i]);

printf("%d\n",sum);

return

0;}

洛谷 P1197 JSOI2008 星球大戰

題目描述 很久以前,在乙個遙遠的星系,乙個黑暗的帝國靠著它的超級 統治者整個星系。某一天,憑著乙個偶然的機遇,一支反抗軍摧毀了帝國的超級 並攻下了星系中幾乎所有的星球。這些星球通過特殊的以太隧道互相直接或間接地連線。但好景不長,很快帝國又重新造出了他的超級 憑藉這超級 的力量,帝國開始有計畫地摧毀反...

洛谷P1197 JSOI2008 星球大戰

很久以前,在乙個遙遠的星系,乙個黑暗的帝國靠著它的超級 統治者整個星系。某一天,憑著乙個偶然的機遇,一支反抗軍摧毀了帝國的超級 並攻下了星系中幾乎所有的星球。這些星球通過特殊的以太隧道互相直接或間接地連線。但好景不長,很快帝國又重新造出了他的超級 憑藉這超級 的力量,帝國開始有計畫地摧毀反抗軍占領的...

洛谷 P1197 JSOI2008 星球大戰

題目描述 很久以前,在乙個遙遠的星系,乙個黑暗的帝國靠著它的超級 統治者整個星系。某一天,憑著乙個偶然的機遇,一支反抗軍摧毀了帝國的超級 並攻下了星系中幾乎所有的星球。這些星球通過特殊的以太隧道互相直接或間接地連線。但好景不長,很快帝國又重新造出了他的超級 憑藉這超級 的力量,帝國開始有計畫地摧毀反...