社区讨论
求助:已经知道是离散化错了,但是改为还错,求解释
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 条回复,欢迎继续交流。
正在加载回复...