警示后人之 WA on 8 or 9
查看原帖
警示后人之 WA on 8 or 9
271736
Daidly楼主2022/9/14 20:12

存在多个区间右端点是同一秒的情况,此时不能直接修改,要与之前的区间求出的这一秒的答案取 min\min

譬如,单点修改不能这样:

void modify(int l,int r,int pos,int x,int p){
	if(l==r){
		t[p].minn=x;
		return;
	}
	int mid=l+r>>1;
	if(pos<=mid)modify(l,mid,pos,x,p<<1);
	else modify(mid+1,r,pos,x,p<<1|1);
	push_up(p);
}

而需要这样:

void modify(int l,int r,int pos,int x,int p){
	if(l==r){
		t[p].minn=min(t[p].minn,x);
		return;
	}
	int mid=l+r>>1;
	if(pos<=mid)modify(l,mid,pos,x,p<<1);
	else modify(mid+1,r,pos,x,p<<1|1);
	push_up(p);
}

还有一个小点存在于 WA 8,是因为要特判极大值,不能将极大值再加上一个数,这样会对 -1 的判断造成影响。

放出 AC 代码

#include<bits/stdc++.h>
using namespace std;

#define int long long 

inline int read(){
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}

inline void print(int x){
	if(x<0)putchar('-'),x=-x;
	if(x>9)print(x/10);
	putchar(x%10^48);
}

const int N=1e4+5,M=1e5+5;
int n,m,e,num;
struct node{
	int l,r,w;
	bool operator<(const node &p)const{
		return r<p.r;
	}
}a[N],tmp[N];

struct tree{
	int minn;
}t[M<<2];

void push_up(int p){
	t[p].minn=min(t[p<<1].minn,t[p<<1|1].minn);
}

void build(int l,int r,int p){
	if(l==r){t[p].minn=1e15;return;}
	int mid=l+r>>1;
	build(l,mid,p<<1);
	build(mid+1,r,p<<1|1);
	push_up(p);
}

int query(int l,int r,int lq,int rq,int p){
	if(lq<=l&&r<=rq)return t[p].minn;
	int mid=l+r>>1,ans=1e15;
	if(lq<=mid)ans=min(ans,query(l,mid,lq,rq,p<<1));
	if(mid<rq)ans=min(ans,query(mid+1,r,lq,rq,p<<1|1));
	return ans;
}

void modify(int l,int r,int pos,int x,int p){
	if(l==r){
		t[p].minn=min(t[p].minn,x);
		return;
	}
	int mid=l+r>>1;
	if(pos<=mid)modify(l,mid,pos,x,p<<1);
	else modify(mid+1,r,pos,x,p<<1|1);
	push_up(p);
}

signed main(){
	n=read(),m=read(),e=read();
	for(int i=1;i<=n;++i){
		tmp[i].l=read(),tmp[i].r=read(),tmp[i].w=read();
		if(tmp[i].r<m||e<tmp[i].l)continue;
		tmp[i].l=max(tmp[i].l,m);
		tmp[i].r=min(tmp[i].r,e);
		a[++num]=(node){tmp[i].l-m+1,tmp[i].r-m+1,tmp[i].w};
	}
	m=e-m+1;
	sort(a+1,a+num+1);
	build(0,m,1);
	modify(0,m,0,0,1);
	for(int i=1;i<=num;++i){
		int tmp=query(0,m,a[i].l-1,a[i].r-1,1);
		if(tmp==1e15)continue;
		modify(0,m,a[i].r,tmp+a[i].w,1);
	}
	int ans=query(0,m,m,m,1);
	if(ans==1e15)puts("-1");
	else print(ans);
	return 0;
}

跑的还挺快的

2022/9/14 20:12
加载中...