我为Blocks编写的此段树(惰性传播)代码有什么问题(关于hackerearth的问题)?

时间:2019-04-13 12:38:31

标签: algorithm data-structures segment-tree

我在实现带有延迟传播的段树时遇到麻烦。我刚读了段树,并试图做一个简单的问题(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到底在哪里(这是更新和查询功能的退出条件之一)。

0 个答案:

没有答案