제출 #1285017

#제출 시각아이디문제언어결과실행 시간메모리
1285017tudor_costin치료 계획 (JOI20_treatment)C++20
100 / 100
1388 ms333256 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int Mmax=1e5+5;
struct tratament
{
    int t,l,r,c;
};
tratament trat[Mmax];
bool viz[Mmax];
map<int,int> nrm;
vector<pair<int,int>> g[Mmax];
set<pair<int,int>> aint[4*Mmax][5];
vector<int> intime[Mmax];
void build(int nod,int l,int r)
{
    if(l==r)
    {
        for(int idx:intime[l])
        {
            aint[nod][1].insert({trat[idx].l+trat[idx].t-1,idx});
            aint[nod][2].insert({trat[idx].l-trat[idx].t-1,idx});
        }
        return;
    }
    int mid=(l+r)/2;
    build(2*nod,l,mid);
    build(2*nod+1,mid+1,r);
    for(auto x:aint[2*nod][1]) aint[nod][1].insert(x);
    for(auto x:aint[2*nod][2]) aint[nod][2].insert(x);
    for(auto x:aint[2*nod+1][1]) aint[nod][1].insert(x);
    for(auto x:aint[2*nod+1][2]) aint[nod][2].insert(x);
    return;
}
vector<int> query(int nod,int l,int r,int st,int dr,int cmp,int tip)
{
    if(st<=l && r<=dr)
    {
        vector<pair<int,int>> er;
        vector<int> ans;
        for(auto pi:aint[nod][tip])
        {
            if(viz[pi.second])
            {
                er.push_back(pi);
                continue;
            }
            if(pi.first>cmp) break;
            er.push_back(pi);
            ans.push_back(pi.second);
        }
        for(auto x:er)
        {
            aint[nod][tip].erase(x);
        }
        return ans;
    }
    int mid=(l+r)/2;
    if(dr<=mid) return query(2*nod,l,mid,st,dr,cmp,tip);
    else if(mid<st) return query(2*nod+1,mid+1,r,st,dr,cmp,tip);
    else
    {
        vector<int> vst=query(2*nod,l,mid,st,mid,cmp,tip);
        vector<int> vdr=query(2*nod+1,mid+1,r,mid+1,dr,cmp,tip);
        if(vst.size()>vdr.size())
        {
            for(int x:vdr) vst.push_back(x);
            return vst;
        }
        for(int x:vst) vdr.push_back(x);
        return vdr;
    }
}
signed main()
{
    int n,m;
    cin>>n>>m;
    priority_queue<pair<int,int>> pq;
    bool ok=1;
    for(int i=1;i<=m;i++)
    {
        cin>>trat[i].t>>trat[i].l>>trat[i].r>>trat[i].c;
        nrm[trat[i].t]=0;
        if(trat[i].t!=1) ok=0;
        if(trat[i].l==1)
        {
            pq.push({-trat[i].c,i});
            viz[i]=1;
        }
    }
    int cnt=1;
    for(auto [timp,v]:nrm)
    {
        nrm[timp]=cnt;
        cnt++;
    }
    cnt--;
    for(int i=1;i<=m;i++)
    {
        intime[nrm[trat[i].t]].push_back(i);
    }
    build(1,1,cnt);
    /*
    for(int i=1;i<=m;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(j==i) continue;
            if(trat[i].t<trat[j].t)
            {
                if(trat[i].r+trat[i].t>=trat[j].l+trat[j].t-1) g[i].push_back({j,trat[j].c});
            }
            else
            {
                 if(trat[i].r-trat[i].t>=trat[j].l-trat[j].t-1) g[i].push_back({j,trat[j].c});
            }
        }
    }*/
    while(!pq.empty())
    {
        auto [val,nod]=pq.top();
        pq.pop();
        if(trat[nod].r==n)
        {
            cout<<-val<<'\n';
            return 0;
        }
        vector<int> nxtnodes1;
        if(nrm[trat[nod].t]+1<=cnt) nxtnodes1=query(1,1,cnt,nrm[trat[nod].t]+1,cnt,trat[nod].r+trat[nod].t,1);
        vector<int> nxtnodes2=query(1,1,cnt,1,nrm[trat[nod].t],trat[nod].r-trat[nod].t,2);
        for(int u:nxtnodes1)
        {
            pq.push({val-trat[u].c,u});
            viz[u]=1;
        }
        for(int u:nxtnodes2)
        {
            pq.push({val-trat[u].c,u});
            viz[u]=1;
        }
    }
    cout<<-1<<'\n';
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...