OI賽第二場Reason For Living

2021-08-07 23:49:17 字數 1351 閱讀 3753

小b準備設計施工方案。設計圖是乙個n

n個點m m

條邊的圖,小b每次施工可以取圖中乙個還沒有完工的生成森林把它完工。為了加快施工效率,每次取的時候小b都會最大化當前這個生成森林的邊數。請你幫他找出乙個符合要求的施工方案。如果有多個方案,輸出任意一種即可。

第一行兩個整數n

n, m m

。後面m

m行,每行兩個數ai,

biai,bi

表示一條邊,保證沒有自環。

m m

行,每行乙個整數,表示這條邊屬於第幾次。如果有多個方案,輸出任意一種即可。

input

5 7

1 22 3

3 44 5

1 22 3

1 2

output

111

1322

20

% 20%

的分數滿足n

≤1000,m

≤1000

n≤1000,m≤1000。

40%40%

的分數滿足n≤10

4,m≤

104n≤104,m≤104。

80%80%

的分數滿足n≤10

5,m≤

105n≤105,m≤105。

100% 100%

的分數滿足n≤10

6,m≤

106n≤106,m≤106。

1s, 512mb

題解

先說什麼是生成森林,就是所以的生成樹組成生成森林,一顆樹也算乙個森林。然後就看加邊的過程,由於有好多相同的邊,所以前往後一顆樹一棵樹的列舉,如果它們的father不是同乙個數,就可以加進去,因為樹上不能有環。用了二維並查集,fa[i][j]表示第i個點在第i棵樹的根,為了省空間開了乙個mem存第二維,每個節點i開du[i]個空間,能充分利用,注意用指標要從0開始,選樹時候可以二分。

#include#include#include#includeusing namespace std;

const int maxn=1000010;

int mem[maxn*2],*iter=mem,*fa[maxn],u[maxn],v[maxn],du[maxn];

int find(int x,int id)

int main()

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

int ans=l;

printf("%d\n",ans+1);

fa[find(x,ans)][ans]=find(y,ans);

}return 0;

}

暑期個人賽 第二場 A

時間限制 1000 ms 記憶體限制 65536 kb 丁神要去google上班了,去之前丁神想再做一道水題,但時間不多了,所以他希望題目做起來既水又快。現在一共有 n 道題,編號從1到 n 每道題有兩個值 a 和 b a 為做這道題需要的時間,b 為題目的 水值 丁神希望做b a 最大的那題。輸入...

省賽選拔賽 組隊賽第二場

rank 5。2013年通化全國邀請賽的題。比賽時出了2道題,打完之後才知道杭電g 編譯器有問題,d題同樣的 c 能ac,g 一直超時。一開始a題交了好久次才過罰時好多,一著急就亂了,改乙個地方就提交,這個必須改。a hdu 4493 給出12個月的工資,求平均薪水,貌似是因為資料大和浮點數精度問題...

暑期個人賽 第二場 C

時間限制 1000 ms 記憶體限制 65536 kb 現有一段橫向長度為n的山脈,其中每段有乙個獨一無二的高度hi 1到n之間的正整數 現在你想知道對於長度為n的山脈,可能有這樣的山脈多少種。這樣的山脈是 某個位置要麼比兩邊的高度都低,要麼比兩邊的高度都高。兩座山脈 a和 b 不同當且僅當存在乙個...