BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / acm-icpc / #92392同步于 2017/3/15
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ACM_ICPC机器人发帖

OJ-268 进程管理

yjc120592
2017/3/15镜像同步6 回复
我用多叉树的父亲表示法,即 tree[i] = i_parent 存储。删除时置 -1,查找时不断向上到 0 则成功,答案超时。我看统计结果中最短只要 5ms,请问可以用什么高效的数据结构呢?
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
chenxiansf机器人#1 · 2017/3/15
#include <stdio.h> struct process { bool mark; bool son[101]; }buf[101]; void create(int a) { buf[a].mark = true; for (int i = 0; i < 101; i++) { buf[a].son[i] = false; } } void kill(int a) { buf[a].mark = false; for (int i = 0; i < 101; i++) { if (buf[a].son[i]) { kill(i); } } } int main() { int t; scanf("%d", &t); while (t--) { create(0); for (int i = 1; i < 101; i++) { buf[i].mark = false; } int n; scanf("%d", &n); while (n--) { char str[20]; scanf("%s", str); if (str[0] == 'F') { int a, b; scanf("%d%d", &a, &b); buf[a].son[b] = true; if (!buf[b].mark) create(b); } else if (str[0] == 'Q') { int a; scanf("%d", &a); if (buf[a].mark) printf("Yes\n"); else printf("No\n"); } else { int a; scanf("%d", &a); kill(a); buf[0].mark = true; } } } return 0; } 【 在 yjc120592 的大作中提到: 】 : 我用多叉树的父亲表示法,即 tree[i] = i_parent 存储。删除时置 -1,查找时不断向上到 0 则成功,答案超时。我看统计结果中最短只要 5ms,请问可以用什么高效的数据结构呢?
yjc120592机器人#2 · 2017/3/16
【 在 chenxiansf 的大作中提到: 】 谢谢,看来必须用多叉树的孩子表示法。结合之前做过的此类题,我感觉北邮 OJ 的查找题,测试用例都属于“查找繁忙型”,应该让查找时间复杂度为 O(1)。但如果是“增删繁忙型”,这种方法就不太高效了。你觉得呢?
chenxiansf机器人#3 · 2017/3/16
感觉有道理 【 在 yjc120592 的大作中提到: 】 : : 谢谢,看来必须用多叉树的孩子表示法。结合之前做过的此类题,我感觉北邮 OJ 的查找题,测试用例都属于“查找繁忙型”,应该让查找时间复杂度为 O(1)。但如果是“增删繁忙型”,这种方法就不太高效了。你觉得呢?
Viredery机器人#4 · 2017/3/16
如果是0->1->2,删了1又增加了1,此时查找2呢
yjc120592机器人#5 · 2017/3/16
【 在 viredery 的大作中提到: 】 : 如果是0->1->2,删了1又增加了1,此时查找2呢 2 不存在。另外题目有限定,被 kill 的进程不会再 fork
gungnir0123机器人#6 · 2017/3/18
题目不是只有query时才会输出yes或者no吗?为啥样例中有4个query操作,但是有5个输出