为什么这样建主席树只能拿50分啊。。。
查看原帖
为什么这样建主席树只能拿50分啊。。。
915665
xybq楼主2024/1/22 22:21
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10,inf=1e5+5;
struct dates
{
    int d=0;
    int p,l;
    bool operator<(const dates &t)const{
        return d>t.d;
    }
}date[N];
struct xdss
{
    int l,r,lsum,rmbs;//对应分支位置就是单价,越靠左越便宜,果汁总量,总价格.
}xds[N*32];
int root[N],idx;
void motify(int pre,int &rt,int l,int r,int pos,int val)
{
    if(!rt) rt=++idx;
    xds[rt].lsum=xds[pre].lsum+val;
    xds[rt].rmbs=xds[pre].rmbs+val*pos;
    if(l==r) return;
    int mid=(l+r)>>1;
    if(pos<=mid)
    {
        xds[rt].r=xds[pre].r;
        motify(xds[pre].l,xds[rt].l,l,mid,pos,val);
    }
    else
    {
        xds[rt].l=xds[pre].l;
        motify(xds[pre].r,xds[rt].r,mid+1,r,pos,val);
    }
}
bool check(int rt,int l,int r,int rmbs,int lsum)
{
    if(xds[rt].lsum<lsum) return false;
    if(l==r)
    {
        rmbs-=l*lsum;
        if(rmbs>=0) return true;
        return false;
    }
    int zsum=xds[xds[rt].l].lsum;
    int mid=l+r>>1;
    if(lsum<=zsum) return check(xds[rt].l,l,mid,rmbs,lsum);
    else return check(xds[rt].r,mid+1,r,rmbs-xds[xds[rt].l].rmbs,lsum-zsum);
}
void solve()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        int d,p,l;
        cin>>d>>p>>l;
        date[i]={d,p,l};
    }
    sort(date+1,date+1+n);
    for(int i=1;i<=n;i++)
    {
        int d=date[i].d,p=date[i].p,l=date[i].l;
        int pred=date[i-1].d;
        motify(root[pred],root[d],1,inf,p,l);
    }
    while(m--)
    {
        int g,ll;
        cin>>g>>ll;
        int l=1,r=n;
        while(l<r)
        {
            int mid=l+r>>1;
            int d=date[mid].d;
            if(check(root[d],1,inf,g,ll)) r=mid;
            else l=mid+1;
        }
        int d=date[l].d;
        if(check(root[d],1,inf,g,ll)) cout<<d<<'\n';
        else cout<<-1<<'\n';
    }
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr),cout.tie(nullptr);
    int T=1;
    while(T--){solve();}
    return 0;
}
2024/1/22 22:21
加载中...