题目链接

没删除调试输出,原地炸裂,\(80\)->\(0\)。如果你要问剩下的\(20\)呢?答:数组开小了。

这题正向删边判连通性是很不好做的,因为我们并不会并查集的逆操作。于是可以考虑把断边改成逆向连边,某个猴子什么时候和\(1\)号猴子变成连通的,这就是他掉下去的时间,如果本来就与\(1\)号猴子连通,那么它就永远不会掉下去。我用了两个并查集,一个维护连通性,一个维护答案,这两个并查集前面的操作几乎是一模一样的,同时连边,到最后一步也就是某个猴子与\(1\)号猴子变为连通时,前者正常连边,后者不连,因为我们要记录原连通块里的猴子答案是一样的。然后就\(ok\)了。

#include <cstdio>
#include <cstring>
#define Open(s) freopen(s".in","r",stdin);freopen(s".out","w",stdout);
#define Close fclose(stdin);fclose(stdout);
const int MAXN = 500010;
inline int read(){
int s = 0, w = 1;
char ch = getchar();
while(ch < '0' || ch > '9'){ if(ch == '-') w = -1; ch = getchar();}
while(ch >= '0' && ch <= '9') { s = s * 10 + ch - '0'; ch = getchar(); }
return s * w;
}
int n, m;
int a[MAXN], b[MAXN], f[MAXN], ban[MAXN][3], F[MAXN];
int fall_time[MAXN], son[MAXN][3], start_set[MAXN], linked[MAXN];
int junk;
void init(){
for(int i = 1; i <= n; ++i)
f[i] = i;
}
int find(int x){
return f[x] == x ? x : f[x] = find(f[x]);
}
void merge(int x, int y){
f[find(y)] = find(x);
}
void Init(){
for(int i = 1; i <= n; ++i)
F[i] = i;
}
int Find(int x){
return F[x] == x ? x : F[x] = Find(F[x]);
}
void Merge(int x, int y){
F[Find(y)] = Find(x);
}
int main(){
Open("monkey");
memset(fall_time, -1, sizeof fall_time);
n = read(); m = read();
init(); Init();
for(int i = 1; i <= n; ++i){
son[i][1] = read(); son[i][2] = read();
}
for(int i = 1; i <= m; ++i){
a[i] = read(); b[i] = read();
ban[a[i]][b[i]] = 1;
}
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= 2; ++j)
if(!ban[i][j])
if(son[i][j] != -1)
merge(i, son[i][j]), Merge(i, son[i][j]);
for(int i = m; i; --i){
junk = son[a[i]][b[i]];
int fa = find(a[i]) != find(1), fb = find(junk) != find(1);
merge(a[i], junk);
if(fa && find(a[i]) == find(1))
fall_time[Find(a[i])] = i - 1;
else if(fa) Merge(a[i], junk);
if(fb && find(junk) == find(1))
fall_time[Find(junk)] = i - 1;
else if(fb) Merge(a[i], junk);
}
for(int i = 1; i <= n; ++i)
printf("%d\n", fall_time[Find(i)]);
Close;
return 0;
}

最新文章

  1. sql 语句 事务
  2. Spark随笔(三):straggler的产生原因
  3. 重新想象 Windows 8 Store Apps (64) - 后台任务: 开发一个简单的后台任务
  4. Ajax案例(使用ajax进行加法运算)
  5. win7启动文件修复
  6. android百度地图中的地图缩放级别
  7. js中批量处理样式——cssText的使用
  8. iOS开发——JS网页交互——javaScript
  9. hadoop资料汇总(网上)
  10. Sizzle一步步实现所有功能(一)
  11. [HNOI2004]树的计数
  12. eclipse导出maven工程的可执行jar包
  13. 含服务端,客户端,数据库的注册/登录/聊天/在线/离线查看的聊天demo
  14. shell搭建CentOS_7基础环境
  15. QXcbConnection: Could not connect to display
  16. fastjson将json字符串转化成map的五种方法
  17. Ansible安装 入门教程
  18. Alpha冲刺! Day8 - 砍柴
  19. 【BZOJ】3209: 花神的数论题
  20. 下一个更大的数 Next Greater Element

热门文章

  1. ABP框架插件开发
  2. 名字管理系统demo
  3. SQL 注入教程
  4. 今日头条 2018 AI Camp 6 月 2 日在线笔试编程题第二道——两数差的和
  5. 使用JDK的keytool生成Android签名证书
  6. tomcat web.log 系统日志记录文件过大问题修改
  7. ng2模板语法/内置指令速查表
  8. pta数组作业
  9. C#中async和await用法
  10. IE图片下载