我在实现带有延迟传播的段树时遇到麻烦。我刚读了段树,并试图做一个简单的问题(https://www.hackerearth.com/practice/data-structures/advanced-data-structures/segment-trees/practice-problems/algorithm/blocks-2/description/),但得到的答案是错误的。
请帮助我实施。我的代码几乎完全与社论中给出的代码相似,因为我将其用作学习如何将分段树应用于问题的参考。我在代码和编辑代码之间找不到任何会影响输出的重大更改。请告诉我我要去哪里错了。
#include<bits/stdc++.h>
#define mid (lo+(hi-lo)/2)
#define left (2*tidx+1)
#define right (2*tidx+2)
using namespace std;
typedef long long ll;
const ll sz=1e5;
ll st[3*sz]; //segment tree array
ll lazy[3*sz];
void clear_lazy(ll tidx)
{
st[tidx]=lazy[tidx];
lazy[left]=lazy[right]=lazy[tidx];
lazy[tidx]=0;
}
void update(ll tidx, ll lo, ll hi, ll l, ll r, ll val)
{
if(lazy[tidx]) //lo-hi represent segments; l-r represent update range
clear_lazy(tidx); //tidx represents segmentTreeIndex
if(lo>hi || hi<l || lo>r)
return;
if(l<=lo && hi<=r){
st[tidx]=val;
lazy[left]=lazy[right]=val;
return;
}
update(left,lo,mid,l,r,val);
update(right,mid+1,hi,l,r,val);
st[tidx]=max(st[left],st[right]);
return;
}
ll query(ll tidx, ll lo, ll hi, ll l, ll r)
{
if(lazy[tidx])
clear_lazy(tidx);
if(lo>hi || hi<l || lo>r)
return 0;
if(l<=lo && hi<=r)
return st[tidx];
ll q1=query(left,lo,mid,l,r);
ll q2=query(right,mid+1,hi,l,r);
return(max(q1,q2));
}
int main()
{
ll n,l,h,p,c,x;
cin>>n;
while(n--)
{
cin>>l>>h>>p>>c>>x;
ll mx=query(0,0,sz-1,x,x+l-1);
if(c){
update(0,0,sz-1,x,x+l-1,mx+1);
update(0,0,sz-1,x+p-1,x+p-1,mx+h+1);
}
else{
ll qp=query(0,0,sz-1,x+p-1,x+p-1);
if(mx-qp>=h) update(0,0,sz-1,x,x+l-1,mx+1);
else
update(0,0,sz-1,x,x+l-1,qp+h+1);
}
}
cout<<st[0]<<endl;
return 0;
}
我也不知道lo> hi到底在哪里(这是更新和查询功能的退出条件之一)。