Submission #241298

#TimeUsernameProblemLanguageResultExecution timeMemory
241298MercenaryTreatment Project (JOI20_treatment)C++14
100 / 100
338 ms33168 KiB
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/trie_policy.hpp>

#define pb push_back
#define mp make_pair
#define taskname "A"

using namespace std;
using namespace __gnu_pbds;

typedef long long ll;
typedef long double ld;
typedef pair<int,int> ii;
typedef tree <int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> ordered_set;

const int maxn = 1e5 + 10;

int n , m;

struct project{
    int t , l , r , c , id;
    int t1;
}a[maxn];
ll dis[maxn];
priority_queue<pair<ll,int>,vector<pair<ll,int>>,greater<pair<ll,int>>> pq;

template<char T>
struct BIT{
    vector<ii> val[maxn];
    void add(int x , ii y){
        if(T){
            for( ; x > 0 ; x &= x - 1)
                val[x].pb(y);
        }else{
             for( ; x < maxn ; x += x & -x)
                val[x].pb(y);
        }
    }
    void update_dis(int u , ll d){
        d += a[u].c;
//        cout << u << " " <<  d << endl;
        if(dis[u] > d){
            dis[u] = d;
            pq.push(mp(d , u));
        }
    }
    void del(int x , int y , ll dis){
        if(T){
            for( ; x < maxn ; x += x & -x){
                while(val[x].size() > 0 && val[x].back().first <= y){
                    update_dis(val[x].back().second , dis);
                    val[x].pop_back();
                }
            }
        }else{
             for( ; x > 0 ; x &= x - 1){
                while(val[x].size() > 0 && val[x].back().first <= y){
                    update_dis(val[x].back().second , dis);
                    val[x].pop_back();
                }
             }
        }
    }
};

BIT<0> s;
BIT<1> s1;

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    if(fopen(taskname".INP","r")){
		freopen(taskname".INP", "r",stdin);
		freopen(taskname".OUT", "w",stdout);
    }
    fill_n(dis,maxn,1e18);
    cin >> n >> m;
    vector<int> val;
    for(int i = 0 ; i < m ; ++i){
        cin >> a[i].t >> a[i].l >> a[i].r >> a[i].c;
        a[i].id = i;
        a[i].l--;
        val.pb(a[i].t);
    }
    sort(val.begin(),val.end());
    for(int i = 0 ; i < m ; ++i){
        a[i].t1 = lower_bound(val.begin(),val.end(),a[i].t) - val.begin() + 1;
    }
    sort(a , a + m , [&](const project x , const project y){
        return x.t + x.l > y.t + y.l;
         });
    for(int i = 0 ; i < m ; ++i){
        s1.add(a[i].t1,mp(a[i].t + a[i].l , a[i].id));
    }
    sort(a , a + m , [&](const project x , const project y){
        return x.l - x.t > y.l - y.t;
         });
    for(int i = 0 ; i < m ; ++i){
        s.add(a[i].t1,mp(a[i].l - a[i].t , a[i].id));
    }
    sort(a , a + m , [&](const project x , const project y){
        return x.id < y.id;
         });
    ll res = 1e18;
    for(int i = 0 ; i < m ; ++i){
        if(a[i].l == 0){
            dis[i] = a[i].c;
            pq.push(mp(dis[i] , i));
        }
    }
    while(pq.size()){
        auto u = pq.top();pq.pop();
        if(u.first != dis[u.second])continue;
        int i = u.second;
//        cout << i << endl;
        s1.del(a[i].t1 , a[i].r + a[i].t , u.first);
        s.del(a[i].t1 , a[i].r - a[i].t , u.first);
    }
    for(int i = 0 ; i < m ; ++i){
        if(a[i].r == n){
//            cout << i << " " << dis[i] << endl;
            res = min(res , dis[i]);
        }
    }
    if(res == 1e18)cout << -1;
    else cout << res;
}

Compilation message (stderr)

treatment.cpp: In function 'int main()':
treatment.cpp:75:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
   freopen(taskname".INP", "r",stdin);
   ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
treatment.cpp:76:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
   freopen(taskname".OUT", "w",stdout);
   ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...