AC日記 猴子 cogs 2043

2022-05-14 07:26:11 字數 2318 閱讀 3603

★★   輸入檔案:monkeya.in輸出檔案:monkeya.out簡單對比

時間限制:1 s   記憶體限制:256 mb

有n只猴子,第一只尾巴掛在樹上,剩下的n-1只,要麼被其他的猴子抓住,要麼抓住了其他的猴子,要麼兩者均有。當然乙隻猴子最多抓兩隻另外的猴子,因為只有兩隻猴爪子嘛。現在給出這n只猴子抓與被抓的資訊,並且在某個時刻可能某只猴子會放掉它左手或右手的猴子,導致某些猴子落在地上。求每只猴子落地的時間。

第一行兩個n,m,表示有n只猴子,並且總時間為m-1.

接下來n行,描述了每只猴子的資訊,每行兩個數,分別表示這只猴子左手和右手抓的猴子的編號,如果是-1,表示該猴子的那只手沒抓其他的猴子。

再接下來m行,按時間順序給出了一些猴子放手的資訊,第1+n+i行表示i-1時刻某只猴子的放手資訊,資訊以兩個數給出,前者表示放手的猴子的編號,後者表示其放的是哪隻手,1左2右。

共輸出n行,第i行表示第i只猴子掉落的時刻,若第i只猴子道m-1時刻以後還沒掉落,就輸出-1。

3 2-1 3

3 -1

1 21 2

3 1-111

n<=200000,m<=400000

在此鍵入。

思路:逆向並查集~;

這個題仔細讀讀可以發現這群猴子不按套路抓尾巴;

可能乙隻猴子的尾巴會被很多只猴子抓;

所以,這個題就成為了乙個判斷每個時間點連通性的問題;

判斷圖的聯通性自然是用並查集呀;

但是,,,這個題貌似直接搞並查集不可行;

所以,,要加一點點亂搞的操作;

逆向並查集;

我們讀入每個猴子的左右手抓的尾巴(建圖);

然後,開始放手(刪邊);

放手的同時,把放手的操作記錄下來;

然後,開始從第m-1秒到第0秒把放手的邊加回去;

沒加一條邊就通過並查集判斷一下圖的聯通性;

當當前塊與1號聯通時,就記錄time;

怎麼記錄time呢?略略噁心,,就不講了,,可以去看看我的**(直白如話);

最後輸出;

輕鬆ac;

來,上**:

#include #include 

#include

#include

#define maxn 200005

using

namespace

std;

struct

nodetype ;

struct nodetype node[maxn<<2

];struct

edgetype ;

struct edgetype edge[maxn<<2

];int

if_z,n,m,f[maxn],head[maxn],time[maxn];

int cnt,do_s[maxn<<1],do_w[maxn<<1

];char

cget;

bool

if_[maxn],did[maxn];

inline

void read_int(int &now)

while(cget>='

0'&&cget<='9'

)

now*=if_z;

}inline

void edge_add(int

from,int

to)int find(int

x)void search(int

now)

f[y]=x;

if(!did[node[now].l]) search(node[now].l);

}if(node[now].r!=-1&&node[now].ri)

f[y]=x;

if(!did[node[now].r]) search(node[now].r);

}}void search_(int now,int

time_)

}int

main()

for(int i=0;i<=m;i++)

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

for(int i=m;i>=0;i--)

else

if(x_!=1&&y_==1) time[x_]=i;

else

if(x_==1&&y_!=1) time[y_]=i;

f[y_]=x_;

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

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

fclose(stdin);

fclose(stdout);

return0;

}

AC日記 手寫堆ac合併果子(傻子)

今天整理最近的考試題 發現乙個東西叫做優先佇列 priority queue 說白了就是大根堆 但是我對堆的了解還是很少的 所以我決定手寫乙個堆 於是我寫了乙個簡單的堆 手寫的堆說白了就是個二叉樹 能不更新維護的二叉樹,每次維護的時間為logn 但是各種查詢 empty,top什麼的 時間為1 感覺...

AC日記 單詞翻轉 1 7 27

總時間限制 1000ms 記憶體限制 65536kb 描述輸入乙個句子 一行 將句子中的每乙個單詞翻轉後輸出。輸入只有一行,為乙個字串,不超過500個字元。單詞之間以空格隔開。輸出翻轉每乙個單詞後的字串,單詞之間的空格需與原文一致。樣例輸入 hello world樣例輸出 olleh dlrow 思...

AC日記 單詞替換 1 7 21

總時間限制 1000ms 記憶體限制 65536kb 描述輸入乙個字串,以回車結束 字串長度 100 該字串由若干個單詞組成,單詞之間用乙個空格隔開,所有單詞區分大小寫。現需要將其中的某個單詞替換成另乙個單詞,並輸出替換之後的字串。輸入輸入包括3行,第1行是包含多個單詞的字串 s 第2行是待替換的單...