★★ 輸入檔案: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行是待替換的單...