这周听了老师的建议,不应该想着用整的时间去学习ACM,应该用零碎的时间去学习,想了想,确实应该如此。看了看hdu 1754 Hate It,这道题和排兵布阵很相似,唯一有所不同的是,他的查询是查询A到B之间最高的成绩,但是这样改一点就不知道如何去处理了,因为在树状数组中更新一个节点的值会更新整个数组,更别提寻找更新后的区间内的最大值,不过与排兵布阵只有一些区别,排兵布阵中的pushup的记录子节点的sum改成max来记录区间内的最大值,直接更新到子结点,在线段树的每个结点里保留一个mx表示这个区间[lft,rht]里的最大值,每次从叶子结点里更新回来记得更新路径上的mx。
void updata(int pos,int ind,int valu)
{
int lft=tree[ind].lft,rht=tree[ind].rht;
if(lft==rht) tree[ind].mx=valu;
else
{
int mid=tree[ind].mid();
if(pos<=mid) updata(pos,LL(ind),valu);
else updata(pos,RR(ind),valu);
tree[ind].mx=max(tree[LL(ind)].mx,tree[RR(ind)].mx);
}
}
周六好像又有比赛,应该拿一些题目练练手感,加油。