-
C - The Tower of Babylon UVA - 437
排序 + dp,值得注意的是排序的方式。因为这个题目方块的三维具有可交换性,所以比较时和比较前的处理要理顺。 -
HDU 4857
反向建边+topo排序 ,注意题目要求的1,2,3的位置依次尽量靠前,这和字典序是不一样的。所以优先存最大的编号到优先队列里面。 -
HDU 3231
一边拓扑,一边更新值。
for(int i=0;i<V[k][u].size();i++){
int v=V[k][u][i];
val[k][v]=max(val[k][v],val[k][u]+1);
if(!(--in[k][v])){
++cnt;
Q.push(v);
}
}
- cf 770C
依然是反向建边,但这里为了判环,是这样写的
void Dfs(int x){
if(Tag[x]==2)return;
if(Tag[x]==1){
printf("-1");
exit(0);
}
Tag[x]=1;
for(int i=0;i<V[x].size();i++){
int v=V[x][i];
Dfs(v);
}
ans.push_back(x);
Tag[x]=2;
}
-
HDU 6805
在一个点有左右手两种状态,于是把一个点拆成左手和右手两个点,然后附上边权,跑最短路。 -
HH的项链
把询问的区间按右端点排序,然后记录颜色最近一次出现的位置,把它移动到尽量靠右.最后查询用树状数组就可.
sort 以后利用树状数组边 upd 边 calc 是挺常见的一个操作了.
- 巧克力棒 bzoj 1299
先手只要取最长的异或和为0的巧克力棒,那么留下的巧克力棒的异或和一定不为0,后手如果在先手的堆里取,肯定输,后手如果加几根巧克力棒,先手就吃让所有巧克力棒的异或和为零。