00:00:00
2024 CSP J/S RP++
都这么折磨我了必须给复赛 rp++ 好吧...
优先队列+结构体排序
重点的放前面
如果要用
cpp
struct Node {
int l,r;
friend bool operator < (const Node &x,const Node &y) {
return x.r>y.r;
}
};
priority_queue<Node> q;愤怒源头-[USACO06FEB] Stall Reservations S
看提交记录去,反正用线段树做的最少解法应该是过了的,不不知道为什么路径有问题(wrong plan)...
就强调一个问题,端点是会重复的,所以在计算线段树的时候需要添加一个变量
错误的:
cpp
inline void update(int rt,int l,int r,int s,int t,int k,int v) {
if(l>t||r<s)
return ;
if(s<=l&&r<=t) {
if(v==-1) {
tree[rt].maxx=0;
tree[rt].pos=0;
} else {
tree[rt].maxx=l;
tree[rt].pos=k;
}
return ;
}
int mid=(l+r)>>1;
update(lson,l,mid,s,t,k,v);
update(rson,mid+1,r,s,t,k,v);
push_up(rt);
return ;
}正确的:
cpp
inline void update(int rt,int l,int r,int s,int t,int k,int v) {
if(l>t||r<s)
return ;
if(s<=l&&r<=t) {
if(v==-1) {
if(tree[rt].cnt==1) {
tree[rt].maxx=0;
tree[rt].pos=0;
}
tree[rt].cnt--;
} else {
tree[rt].maxx=l;
tree[rt].pos=k;
tree[rt].cnt++;
}
return ;
}
int mid=(l+r)>>1;
update(lson,l,mid,s,t,k,v);
update(rson,mid+1,r,s,t,k,v);
push_up(rt);
return ;
}关于路径问题:
终于破解了,同样由于那个问题,右端点会重复,会有多个牛棚在同一个右端点,即
我的方法是用线段树维护每个端点,时间大,空间大,路径不好打...
现在引用ljs给出的优化解法:
可以用线段树维护每个牛棚,记录最后一个端点,空间时间小,也可以记录路径。
就先说到这了...