欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

一些坑

程序员文章站 2022-07-15 15:48:49
...

Point 1

CodeForces - 543D Road Improvement

正确写法:

for(int i = suf[u].size() - 2; i >= 0; -- i)

错误写法:

for(int i = suf[u].size() - 2; ~i; -- i)

原因是 ~ii 只能判断 1-1 的情况。


Point 2

转自 Arextre

关于 setset 的去重情况。

假设我们定义了一个 sets,对于结构体 node 我们重载其 < 运算。

那么,如果 set 中的两个元素 a,b,假如他们在我们重载或者定义的优先级比较之下,同时不满足 a<b 与 b<a,那么就会判定 a 和 b 是等价的,这个时候 set 就会去重。举个栗子:

struct node{int t,id;
    bool operator <(const node rhs)const{
        return t<rhs.t;
    }
};
set<node>a;

那么,在 set 的去重中,只要满足某两个元素的 t 是一样的,set 就会认定他们是同一元素并去重,而不会在意 id 是否是相同的。


Point 3

HDU - 3622 Bomb Game


Point 4

判断到达叶子节点直接 return 。(前向星)

曾经的写法:

if(nxt[head[u]] == 0) return;

其实就是判断是否只有一条边连接。然而,,,根节点也可能出现这种情况,然后就凉了。

正解:

bool flag = 0;
for(int i = head[u]; i; i = nxt[i]) if(to[i] != fa) DP(to[i], u), flag = 1;
if(! flag) return;