社区讨论

求助:已经知道是离散化错了,但是改为还错,求解释

P1442铁球落地参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@m4fotvq4
此快照首次捕获于
2024/12/08 22:17
去年
此快照最后确认于
2025/11/04 13:06
4 个月前
查看原帖
这是原本的代码:
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,h,x,y,cnt = 1;
struct node{
	int l,r;
}tree[800005];
struct node2{
	int h,l,r,lc,rc;
}a[800005];
int lazy[800005],sum[800005],lcc[100005],rcc[100005],b[200005],f[100005][2];
map<int,int> mp;
void build(int x,int l,int r){
	if(l==r){
		sum[x] = 0;
		return;
	}
	int mid = (l+r)/2;
	tree[x].l = ++cnt;
	build(cnt,l,mid);
	tree[x].r = ++cnt;
	build(cnt,mid+1,r);
	sum[x] = sum[tree[x].l]+sum[tree[x].r];
}
void pushdown(int x,int l,int r){
    if(lazy[x]>=1e18){
        return;
    }
	int mid = (l+r)/2;
	lazy[tree[x].l] = lazy[x];
	sum[tree[x].l] = lazy[x];
	lazy[tree[x].r] = lazy[x];
	sum[tree[x].r] = lazy[x];
	lazy[x] = 1e18;
}
void modify(int x,int l,int r,int a,int b,int c){
	if(a<=l && r<=b){
		lazy[x] = c;
		sum[x] = c;
		return;
	}
	int mid = (l+r)/2;
	pushdown(x,l,r);
	if(a<=mid){
		modify(tree[x].l,l,mid,a,b,c);
	}
	if(b>mid){
		modify(tree[x].r,mid+1,r,a,b,c);
	}
	sum[x] = sum[tree[x].l]+sum[tree[x].r];
}
int query(int x,int l,int r,int a,int b){
	if(a<=l && r<=b){
		return sum[x];
	}
	pushdown(x,l,r);
	int s = 0,mid = (l+r)/2;
	if(a<=mid){
		s+=query(tree[x].l,l,mid,a,b);
	}
	if(b>mid){
		s+=query(tree[x].r,mid+1,r,a,b);
	}
	return s;
}
bool cmp(node2 x,node2 y){
	return x.h<y.h;
}
signed main(){
    memset(lazy,0x3f,sizeof(lazy));
	cin >> n >> h >> x >> y;
	for(int i=1;i<=n;i++){
		cin >> a[i].h >> a[i].l >> a[i].r;
	}
	a[++n] = (node2){y,x,x,0,0};
	b[++m] = a[n].l;
	for(int i=1;i<n;i++){
		b[++m] = a[i].l,b[++m] = a[i].r;
	}
	sort(b+1,b+m+1);
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=n;i++){
		a[i].l = lower_bound(b+1,b+m+1,a[i].l)-b;
		a[i].r = lower_bound(b+1,b+m+1,a[i].r)-b;
	}
	build(1,1,m);
	for(int i=1;i<=n;i++){
		a[i].lc = query(1,1,m,a[i].l,a[i].l);
		a[i].rc = query(1,1,m,a[i].r,a[i].r);
		modify(1,1,m,a[i].l,a[i].r,i);
	}
	memset(f,0x3f,sizeof(f));
	for(int i=1;i<=n;i++){
		int lc = a[i].lc,rc = a[i].rc;
		if(a[i].h-a[lc].h<=h){
			if(!lc){
	            f[i][0] = a[i].h;
			}
			else{
				f[i][0] = min(f[lc][0]+a[i].l-a[lc].l+a[i].h-a[lc].h,f[lc][1]+a[lc].r-a[i].l+a[i].h-a[lc].h);
			}
		}
		if(a[i].h-a[rc].h<=h){
			if(!rc){
	            f[i][1] = a[i].h;
			}
			else{
				f[i][1] = min(f[rc][0]+a[i].r-a[rc].l+a[i].h-a[rc].h,f[rc][1]+a[rc].r-a[i].r+a[i].h-a[rc].h);
			}
		}
	}
	cout << min(f[n][0],f[n][1]);
	return 0;
}
注释掉离散化改成这样后是50分,所以是离散化错了:
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,h,x,y,cnt = 1;
struct node{
	int l,r;
}tree[800005];
struct node2{
	int h,l,r,lc,rc;
}a[800005];
int lazy[800005],sum[800005],lcc[100005],rcc[100005],b[200005],f[100005][2];
map<int,int> mp;
void build(int x,int l,int r){
	if(l==r){
		sum[x] = 0;
		return;
	}
	int mid = (l+r)/2;
	tree[x].l = ++cnt;
	build(cnt,l,mid);
	tree[x].r = ++cnt;
	build(cnt,mid+1,r);
	sum[x] = sum[tree[x].l]+sum[tree[x].r];
}
void pushdown(int x,int l,int r){
    if(lazy[x]>=1e18){
        return;
    }
	int mid = (l+r)/2;
	lazy[tree[x].l] = lazy[x];
	sum[tree[x].l] = lazy[x];
	lazy[tree[x].r] = lazy[x];
	sum[tree[x].r] = lazy[x];
	lazy[x] = 1e18;
}
void modify(int x,int l,int r,int a,int b,int c){
	if(a<=l && r<=b){
		lazy[x] = c;
		sum[x] = c;
		return;
	}
	int mid = (l+r)/2;
	pushdown(x,l,r);
	if(a<=mid){
		modify(tree[x].l,l,mid,a,b,c);
	}
	if(b>mid){
		modify(tree[x].r,mid+1,r,a,b,c);
	}
	sum[x] = sum[tree[x].l]+sum[tree[x].r];
}
int query(int x,int l,int r,int a,int b){
	if(a<=l && r<=b){
		return sum[x];
	}
	pushdown(x,l,r);
	int s = 0,mid = (l+r)/2;
	if(a<=mid){
		s+=query(tree[x].l,l,mid,a,b);
	}
	if(b>mid){
		s+=query(tree[x].r,mid+1,r,a,b);
	}
	return s;
}
bool cmp(node2 x,node2 y){
	return x.h<y.h;
}
signed main(){
    memset(lazy,0x3f,sizeof(lazy));
	cin >> n >> h >> x >> y;
	for(int i=1;i<=n;i++){
		cin >> a[i].h >> a[i].l >> a[i].r;
	}
	a[++n] = (node2){y,x,x,0,0};
	// b[++m] = a[n].l;
	// for(int i=1;i<n;i++){
	// 	b[++m] = a[i].l,b[++m] = a[i].r;
	// }
	// sort(b+1,b+m+1);
	sort(a+1,a+n+1,cmp);
	// for(int i=1;i<=n;i++){
	// 	a[i].l = lower_bound(b+1,b+m+1,a[i].l)-b;
	// 	a[i].r = lower_bound(b+1,b+m+1,a[i].r)-b;
	// }
	build(1,1,1e5);
	for(int i=1;i<=n;i++){
		a[i].lc = query(1,1,1e5,a[i].l,a[i].l);
		a[i].rc = query(1,1,1e5,a[i].r,a[i].r);
		modify(1,1,1e5,a[i].l,a[i].r,i);
	}
	memset(f,0x3f,sizeof(f));
	for(int i=1;i<=n;i++){
		int lc = a[i].lc,rc = a[i].rc;
		if(a[i].h-a[lc].h<=h){
			if(!lc){
	            f[i][0] = a[i].h;
			}
			else{
				f[i][0] = min(f[lc][0]+a[i].l-a[lc].l+a[i].h-a[lc].h,f[lc][1]+a[lc].r-a[i].l+a[i].h-a[lc].h);
			}
		}
		if(a[i].h-a[rc].h<=h){
			if(!rc){
	            f[i][1] = a[i].h;
			}
			else{
				f[i][1] = min(f[rc][0]+a[i].r-a[rc].l+a[i].h-a[rc].h,f[rc][1]+a[rc].r-a[i].r+a[i].h-a[rc].h);
			}
		}
	}
	cout << min(f[n][0],f[n][1]);
	return 0;
}

但是蒟蒻不知道是则么错了,所以求解惑!

回复

2 条回复,欢迎继续交流。

正在加载回复...