제출 #262123

#제출 시각아이디문제언어결과실행 시간메모리
262123Kastanda치료 계획 (JOI20_treatment)C++11
100 / 100
1287 ms101744 KiB
// M
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 100005;
int n, m, T[N], L[N], R[N], C[N], P[N], rev[N];
ll D[N];
vector < int > vec;
priority_queue < pair < ll , int > > Pq;
set < pair < int , int > > ST[2][N];
inline void Add(int w, int i, pair < int , int > val)
{
        for (; i < N; i += i & - i)
                ST[w][i].insert(val);
}
inline void Get(int w, int i, int ri)
{
        for (; i; i -= i & - i)
                while (ST[w][i].size() && ST[w][i].begin()->first <= ri)
                {
                        if (D[ST[w][i].begin()->second] == -1)
                                vec.push_back(ST[w][i].begin()->second);
                        ST[w][i].erase(ST[w][i].begin());
                }
}
int main()
{
        scanf("%d%d", &n, &m);
        for (int i = 1; i <= m; i ++)
                scanf("%d%d%d%d", &T[i], &L[i], &R[i], &C[i]), R[i] ++;
        iota(P + 1, P + m + 1, 1);
        sort(P + 1, P + m + 1, [&](int i, int j){return T[i] < T[j];});
        for (int i = 1; i <= m; i ++)
                rev[P[i]] = i;

        for (int i = m; i; i --)
                Add(0, m - i + 1, make_pair(L[P[i]] + T[P[i]], P[i]));
        for (int i = 1; i <= m; i ++)
                Add(1, i, make_pair(L[P[i]] - T[P[i]], P[i]));

        memset(D, -1, sizeof(D));
        for (int i = 1; i <= m; i ++)
                if (L[i] == 1)
                        D[i] = C[i], Pq.push({-D[i], i});

        while (Pq.size())
        {
                ll d = - Pq.top().first;
                int v = Pq.top().second;
                Pq.pop();
                if (R[v] == n + 1)
                        return !printf("%lld\n", d);

                vec.clear();
                Get(0, m - rev[v], R[v] + T[v]);
                Get(1, rev[v] - 1, R[v] - T[v]);

                for (int u : vec)
                        if (D[u] == -1)
                                D[u] = D[v] + C[u], Pq.push({-D[u], u});
        }
        return !printf("-1\n");
}

컴파일 시 표준 에러 (stderr) 메시지

treatment.cpp: In function 'int main()':
treatment.cpp:28:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   28 |         scanf("%d%d", &n, &m);
      |         ~~~~~^~~~~~~~~~~~~~~~
treatment.cpp:30:22: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   30 |                 scanf("%d%d%d%d", &T[i], &L[i], &R[i], &C[i]), R[i] ++;
      |                 ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...