제출 #1339526

#제출 시각아이디문제언어결과실행 시간메모리
1339526tuanhung0Airplane (NOI23_airplane)C++20
0 / 100
1102 ms276404 KiB
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define fi first
#define se second
#define pb emplace_back
const int mod = 1e9 + 7;
const int nmax = 2e5 + 5;
int n, m, a[nmax], suf[nmax];
pair<int, int> d1[nmax], dn[nmax];
vector<int> adj[nmax];

void sub1() { // full
    for (int i = n; i >= 1; --i) suf[i] = max(suf[i + 1], a[i]);
    int cur = 0, ans = 0;
    for (int i = 1; i < n; ++i) {
        while (cur < a[i + 1] - 1) {
            ++cur;
            ++ans;
        }

        if (cur < suf[i + 1]) ++cur;
        else if (cur > suf[i + 1]) --cur;
        ++ans;
    }

    cout << ans + cur;
}

struct node {
    int dist, mx, spare, idx;

    node(int _dist, int _mx, int _spare, int _idx) : dist(_dist), mx(_mx), spare(_spare), idx(_idx) {}

    bool operator < (const node &other) const {
        return dist < other.dist;
    }

    bool operator > (const node &other) const {
        return dist > other.dist;
    }
};

void dijkstra(int s, pair<int, int> d[]) {
    priority_queue<node, vector<node>, greater<node>> pq;
    pq.push({node(0, a[s], 0, s)});
    d[s] = {0, 0};
    int _dist, _mx, _spare, _idx;
    while (!pq.empty()) {
        node top = pq.top();
        pq.pop();
        _dist = top.dist;
        _mx = top.mx;
        _spare = top.spare;
        _idx = top.idx;
        if (_dist > d[_idx].fi) continue;
        else if (_spare < d[_idx].se) continue;
        for (int v : adj[_idx]) {
            if (_mx > a[v]) {
                if (_dist + 1 > d[v].fi) continue;
                if (_dist + 1 < d[v].fi || (_dist + 1 == d[v].fi && _spare + 1 > d[v].se)) {
                    pq.push(node(_dist + 1, _mx, _spare + 1, v));
                }
            } else if (_mx == a[v]) {
                if (_dist + 1 > d[v].fi) continue;
                if (_dist + 1 < d[v].fi || (_dist + 1 == d[v].fi && _spare + 1 > d[v].se)) {
                    d[v] = {_dist + 1, _spare + 1};
                    pq.push(node(d[v].fi, a[v], d[v].se, v));
                }
            } else {
                int newdist = _dist - min(0, _spare - a[v] + _mx);
                if (newdist < d[v].fi) {
                    d[v] = {newdist, 0};
                    pq.push(node(d[v].fi, a[v], d[v].se, v));
                }
            }
        }
    }
}

void sub4() {
    fill(d1 + 1, d1 + 1 + n, make_pair(1000000000, -1000000000));
    dijkstra(1, d1);
    // for (int i = 1; i <= n; ++i) cout << d1[i].fi << ' ' << d1[i].se << '\n';
    fill(dn + 1, dn + 1 + n, make_pair(1000000000, -1000000000));
    dijkstra(n, dn);
    // for (int i = 1; i <= n; ++i) cout << dn[i].fi << ' ' << dn[i].se << '\n';

    int ans = INT_MAX;
    for (int i = 1; i <= n; ++i) {
        ans = min(ans, d1[i].fi + dn[i].fi);
    }

    cout << ans;
}

signed main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    if (fopen("test.inp", "r")) {
        freopen("test.inp", "r", stdin);
        freopen("test.out", "w", stdout);
    }

    cin >> n >> m;
    bool checksub1 = (m == n - 1);
    for (int i = 1; i <= n; ++i) cin >> a[i];
    for (int i = 1; i <= m; ++i) {
        int u, v; cin >> u >> v;
        adj[u].pb(v);
        adj[v].pb(u);
        if (u != i || v != i + 1) checksub1 = 0;
    }

    sub4();

    return 0;
}

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

Main.cpp: In function 'int main()':
Main.cpp:102:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  102 |         freopen("test.inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:103:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  103 |         freopen("test.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...