제출 #1256818

#제출 시각아이디문제언어결과실행 시간메모리
1256818tradzAesthetic (NOI20_aesthetic)C++20
22 / 100
647 ms47776 KiB
#include <bits/stdc++.h>
#define TIME  (1.0 * clock() / CLOCKS_PER_SEC)
#define For(i,a,b) for(int i = a; i <= b; i++)
#define Ford(i,a,b) for(int i = a; i >= b; i--)
#define ll long long
#define ii pair<int,int>
#define fi first
#define se second
#define all(v) v.begin(),v.end()
#define RRH(v) v.resize(unique(all(v)) - v.begin())

using namespace std;
const int  N = 300000 + 7;
const int Mod = 1e9 + 7;
const ll INF = (ll)3e18;
const ll BASE = 137;

mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
long long GetRandom(long long l, long long r) {
    return uniform_int_distribution<long long> (l, r)(rng);
}

struct Edge {
    int u, v, w;
};

int n, m;
Edge edges[N];
ll dp[2][N];
int Cost[N];
vector<ii> ke[N], adj[N];

int low[N], numt[N];

void solution() {
    cin >> n >> m;
    For(i,1,m) {
        int u, v, w; cin >> u >> v >> w;
        ke[u].push_back({v,w});
        ke[v].push_back({u,w});
        edges[i] = {u,v,w};
    }

    For(i,1,m+2) Cost[i] = 0;
    Ford(i,m,1) {
        Cost[i] = max(edges[i].w, Cost[i+1]);
    }

    For(t,0,1) For(i,1,n) dp[t][i] = INF;

    auto Dijkstra = [&](int st, int typ) {
        vector<char> vis(n+1, 0);
        priority_queue<pair<ll,int>, vector<pair<ll,int>>, greater<pair<ll,int>>> pq;
        dp[typ][st] = 0;
        pq.push({0, st});
        while (!pq.empty()) {
            auto cur = pq.top(); pq.pop();
            int u = cur.second;
            if (vis[u]) continue;
            vis[u] = 1;
            for (auto &id : ke[u]) {
                int v = id.fi, w = id.se;
                if (dp[typ][v] > dp[typ][u] + w) {
                    dp[typ][v] = dp[typ][u] + w;
                    pq.push({dp[typ][v], v});
                }
            }
        }
    };

    Dijkstra(1, 0);
    Dijkstra(n, 1);

    function<int(ll)> check = [&](ll X) -> int {
        For(i,1,n) {
            vector<ii>().swap(adj[i]);
            low[i] = numt[i] = 0;
        }

        For(i,1,m) {
            int u = edges[i].u, v = edges[i].v, w = edges[i].w;
            if ((dp[0][u] + dp[1][v] + w + Cost[i + 1] < X) || (dp[0][v] + dp[1][u] + w + Cost[i + 1] < X)) {
                int added = w + Cost[i+1];
                adj[u].push_back({v, added});
                adj[v].push_back({u, added});
            }
        }

        int time_dfs = 0;
        int res = 0;
        function<void(int,int)> dfs = [&](int u, int p) {
            low[u] = numt[u] = ++time_dfs;
            for (auto &ed : adj[u]) {
                int v = ed.fi;
                ll w = ed.se;
                if (v == p) continue;
                if (!numt[v]) {
                    dfs(v, u);
                    low[u] = min(low[u], low[v]);
                    if (low[v] == numt[v] && numt[v] <= numt[n]) {
                       // if (dp[0][u] + dp[1][v] + w >= X) res = 1;
                    }
                } else {
                    low[u] = min(low[u], numt[v]);
                }
            }
        };

        dfs(1, 0);
        if (!numt[n]) return 1;
        return res;
    };

    ll L = dp[0][n];
    if (L >= INF/4) L = INF/4;
    ll R = dp[0][n] * 2 + Cost[1];
    if (R < L) R = L;

    while (L < R) {
        ll mid = (L + R + 1) >> 1;
        if (check(mid)) L = mid;
        else R = mid - 1;
    }

    cout << L << '\n';
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

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

    solution();

    cerr << "Time elapsed: " << TIME << " s.\n";
    return 0;
}

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

Aesthetic.cpp: In function 'int main()':
Aesthetic.cpp:134:17: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  134 |         freopen (".inp", "r", stdin);
      |         ~~~~~~~~^~~~~~~~~~~~~~~~~~~~
Aesthetic.cpp:135:17: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  135 |         freopen (".out", "w", stdout);
      |         ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~
Aesthetic.cpp:138:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  138 |         freopen(TASK".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
Aesthetic.cpp:139:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  139 |         freopen(TASK".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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...