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

关于hdu 1540 的一点疑问。

windowsills
2017/6/2镜像同步4 回复
题目:hdu1540 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1540 题目的大意是:有n个村庄在一条直线上,编号从1到n,每个村庄和相邻的两个村庄有一条边,三种操作,D a表示把村庄a摧毁,Q a表示询问和村庄a连通的村庄数量,R把最近摧毁的村庄复原。 代码提交结果:wa 我对这道题有如下想法: 基本思路是数状数组+二分查找。 sum(i)表示从村庄1到村庄i(包括i在内)被摧毁的村庄数。 (1) 对于每次查询村庄i,sum(i)由定义可知是随i值单调递增的, 二分查找sum(i), sum(i)+1的左边界值, 假定结果分别为left, right。 left,right值分别代表离i最近的被摧毁的村庄下标。则查询结果为right-left-1 (2)R操作不包含操作值,使用栈存储最近一次被摧毁的村庄下标 (3) 数状数组的更新。 根据sum(i)的定义, 每次摧毁村庄时, add(x, 1), 修复村庄时add(x, -1) 具体代码见附件:
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
kit机器人#1 · 2017/6/2
根据discuss的说法,这个题目会连续摧毁或连续修复同一个村庄。直接+1或-1不太对吧。 这个m*log(n)^2的方法不会超时吗?这个思路我用线段树写了一下就超时了,换成维护左右连续长度的方法才过。
windowsills机器人#2 · 2017/6/2
能给个case吗?我想了一些case,都Pass了,但提交还是wa。代码在附件中,真心求教。 【 在 kit 的大作中提到: 】 根据discuss的说法,这个题目会连续摧毁或连续修复...
kit机器人#3 · 2017/6/2
7 100 D 3 D 3 D 4 D 4 D 4 D 5 D 5 R R R Q 4 ---------------------- 正确答案是4,你的答案是3
windowsills机器人#4 · 2017/6/2
如果这个确实是题意的话,我确实读题有误,没领会到。 你给的例子中最后有3个R, 3、4、5都恢复的话,正确答案应该是7? 而不是4? 另外 我按照你的建议在代码中做了修改,但提交后仍然是WA.所以问题是不是可能不在这里? diff --git a/topics/binary indexed trees/hdu1540.cpp b/topics/binary indexed trees/hdu1540.cpp index b87eaa4..31bff02 100644 --- a/topics/binary indexed trees/hdu1540.cpp +++ b/topics/binary indexed trees/hdu1540.cpp @@ -60,13 +60,11 @@ int main() { cin >> op; if (op == "D") { cin >> val; + if (vis[val] == 1) continue; data[++i] = val; vis[val] = 1; add(val, 1); } else if (op == "Q") { - for (int i = 1; i <= n; i++) { - //printf("sum(%d)=%d\n", i, sum(i)); - } cin >> val; if (vis[val] == 1) { printf("%d\n", 0); 【 在 kit 的大作中提到: 】 : 7 100 : D 3 : D 3 : ...................