存在多个区间右端点是同一秒的情况,此时不能直接修改,要与之前的区间求出的这一秒的答案取 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;
}
跑的还挺快的