답안 #1087620

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1087620 2024-09-13T03:04:40 Z Whisper Aesthetic (NOI20_aesthetic) C++17
51 / 100
727 ms 75476 KB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

#define int long long
#define FOR(i, a, b) for (int i = (a); i <= (b); i++)
#define FORD(i, a, b) for (int i = (b); i >= (a); i --)
#define REP(i, a) for (int i = 0; i < (a); ++i)
#define REPD(i, a) for (int i = (a) - 1; i >= 0; --i)

#define MASK(i) (1LL << (i))
#define BIT(x, i) (((x) >> (i)) & 1)


constexpr ll LINF = (1ll << 60);
constexpr int INF = (1ll << 30);
constexpr int Mod = 1e9 + 7;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

/*
    Phu Trong from Nguyen Tat Thanh High School for gifted student
*/

template <class X, class Y>
    bool minimize(X &x, const Y &y){
        X eps = 1e-9;
        if (x > y + eps) {x = y; return 1;}
        return 0;
    }

template <class X, class Y>
    bool maximize(X &x, const Y &y){
        X eps = 1e-9;
        if (x + eps < y) {x = y; return 1;}
        return 0;
    }
#define MAX                 300005
int numNode, numEdge;
vector<int> G[MAX];
struct Edge{
    int u, v, w;
    Edge(){}
    Edge(int _u, int _v, int _w): u(_u), v(_v), w(_w){}

    int other(int x){return (x ^ u ^ v);}
} edge[MAX];
int minDist[2][MAX];

void dijkstra(int s, int minDist[]){
    for (int i = 1; i <= numNode; ++i) minDist[i] = LINF;
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q;
    q.emplace(0, s);
    minDist[s] = 0;
    while(q.size()){
        int du, u; tie(du, u) = q.top(); q.pop();
        if(du > minDist[u]) continue;

        for(int&i : G[u]) {
            int v = edge[i].other(u);
            if(minimize(minDist[v], minDist[u] + edge[i].w)){
                q.emplace(minDist[v], v);
            }
        }
    }
}

int low[MAX], num[MAX], timeDfs = 0;

int suffix[MAX];
bool contain[MAX];
vector<pair<int, int>> newG[MAX];
bool ok = 0;

int value = 0;
void tarjan(int u, int p){
    if(u == numNode) contain[u] = true;
    low[u] = num[u] = ++timeDfs;
    for (pair<int, int>&x : newG[u]){
        int v = x.first, i = x.second;
        if(i ^ p){
            if(num[v]) minimize(low[u], num[v]);
            else{
                tarjan(v, i);
                minimize(low[u], low[v]);
                contain[u] |= contain[v];

                if(num[v] == low[v]){
                    if(!contain[v]) continue;
                    if(minDist[0][u] + edge[i].w + minDist[1][v] != minDist[0][numNode]) continue;
                    if(minDist[0][u] + edge[i].w + minDist[1][v] + suffix[i] >= minDist[0][numNode] + value)
                        ok = 1;
                }
            }
        }
    }
}

void process(void){
    cin >> numNode >> numEdge;
    int max_weight = 0;
    for (int i = 1; i <= numEdge; ++i){
        cin >> edge[i].u >> edge[i].v >> edge[i].w;
        G[edge[i].u].emplace_back(i);
        G[edge[i].v].emplace_back(i);
        maximize(max_weight, edge[i].w);
    }

    dijkstra(1, minDist[0]);
    dijkstra(numNode, minDist[1]);

    suffix[numEdge] = -LINF;
    for (int i = numEdge - 1; i >= 1; --i){
        maximize(suffix[i], suffix[i + 1]);
        maximize(suffix[i], edge[i + 1].w);
    }

    for (int i = 1; i <= numEdge; ++i){
        if(minDist[0][edge[i].u] > minDist[0][edge[i].v]) swap(edge[i].u, edge[i].v);
    }
    int l = 0, r = max_weight + 1;
    int add = 0;

    auto check = [&](int val) -> bool{
        timeDfs = 0, ok = 0;
        value = val;
        for (int i = 1; i <= numNode; ++i) newG[i].clear(), contain[i] = num[i] = low[i] = 0;

        auto active = [&](int u, int v, int w, int x) -> bool{
            if(minDist[0][u] + minDist[1][v] + w < minDist[0][numNode] + x) return true;
            if(minDist[0][v] + minDist[1][u] + w < minDist[0][numNode] + x) return true;
            return false;
        };

        for (int u = 1; u <= numNode; ++u){
            for (int&i : G[u]){
                int v = edge[i].other(u);
                if(active(u, v, edge[i].w, val)) {
                    newG[u].emplace_back(v, i);
                }
            }
        }
        tarjan(1, 0);
        return (ok);
    };

    while(l <= r){
        int m = (l + r) >> 1;
        if(check(m)) l = m + 1, add = m;
        else r = m - 1;
    }

    cout << minDist[0][numNode] + add;
}
signed main(){
    #define name "Whisper"
    cin.tie(nullptr) -> sync_with_stdio(false);
    //freopen(name".inp", "r", stdin);
    //freopen(name".out", "w", stdout);
    process();
    return (0 ^ 0);
}




Compilation message

Aesthetic.cpp: In lambda function:
Aesthetic.cpp:127:81: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
  127 |         for (int i = 1; i <= numNode; ++i) newG[i].clear(), contain[i] = num[i] = low[i] = 0;
      |                                                                          ~~~~~~~^~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 14428 KB Output is correct
2 Correct 7 ms 14428 KB Output is correct
3 Correct 7 ms 14428 KB Output is correct
4 Correct 6 ms 14428 KB Output is correct
5 Correct 6 ms 14424 KB Output is correct
6 Correct 6 ms 14612 KB Output is correct
7 Correct 7 ms 14428 KB Output is correct
8 Correct 6 ms 14584 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 14428 KB Output is correct
2 Correct 7 ms 14428 KB Output is correct
3 Correct 7 ms 14428 KB Output is correct
4 Correct 6 ms 14428 KB Output is correct
5 Correct 6 ms 14424 KB Output is correct
6 Correct 6 ms 14612 KB Output is correct
7 Correct 7 ms 14428 KB Output is correct
8 Correct 6 ms 14584 KB Output is correct
9 Correct 7 ms 14684 KB Output is correct
10 Correct 10 ms 14836 KB Output is correct
11 Correct 7 ms 14684 KB Output is correct
12 Correct 7 ms 14684 KB Output is correct
13 Correct 7 ms 14752 KB Output is correct
14 Correct 8 ms 14684 KB Output is correct
15 Correct 7 ms 14684 KB Output is correct
16 Correct 8 ms 14684 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 653 ms 51024 KB Output is correct
2 Correct 638 ms 51028 KB Output is correct
3 Correct 667 ms 50652 KB Output is correct
4 Correct 648 ms 51028 KB Output is correct
5 Correct 636 ms 51020 KB Output is correct
6 Correct 727 ms 51792 KB Output is correct
7 Correct 652 ms 51540 KB Output is correct
8 Correct 699 ms 51824 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 672 ms 51792 KB Output is correct
2 Correct 642 ms 51340 KB Output is correct
3 Correct 704 ms 51024 KB Output is correct
4 Correct 621 ms 51540 KB Output is correct
5 Correct 611 ms 51236 KB Output is correct
6 Correct 648 ms 51196 KB Output is correct
7 Correct 720 ms 51176 KB Output is correct
8 Correct 611 ms 51460 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 241 ms 44992 KB Output is correct
2 Correct 151 ms 46424 KB Output is correct
3 Correct 186 ms 59732 KB Output is correct
4 Correct 189 ms 59880 KB Output is correct
5 Correct 174 ms 59848 KB Output is correct
6 Correct 179 ms 59732 KB Output is correct
7 Correct 193 ms 59832 KB Output is correct
8 Correct 177 ms 59884 KB Output is correct
9 Correct 184 ms 59740 KB Output is correct
10 Correct 181 ms 60240 KB Output is correct
11 Correct 188 ms 59960 KB Output is correct
12 Correct 215 ms 45152 KB Output is correct
13 Correct 182 ms 59988 KB Output is correct
14 Correct 122 ms 75348 KB Output is correct
15 Correct 132 ms 75476 KB Output is correct
16 Correct 297 ms 45040 KB Output is correct
17 Correct 243 ms 44116 KB Output is correct
18 Correct 248 ms 44612 KB Output is correct
19 Correct 142 ms 46416 KB Output is correct
20 Correct 138 ms 46500 KB Output is correct
21 Correct 140 ms 46676 KB Output is correct
22 Correct 138 ms 46384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 241 ms 44992 KB Output is correct
2 Correct 151 ms 46424 KB Output is correct
3 Correct 186 ms 59732 KB Output is correct
4 Correct 189 ms 59880 KB Output is correct
5 Correct 174 ms 59848 KB Output is correct
6 Correct 179 ms 59732 KB Output is correct
7 Correct 193 ms 59832 KB Output is correct
8 Correct 177 ms 59884 KB Output is correct
9 Correct 184 ms 59740 KB Output is correct
10 Correct 181 ms 60240 KB Output is correct
11 Correct 188 ms 59960 KB Output is correct
12 Correct 215 ms 45152 KB Output is correct
13 Correct 182 ms 59988 KB Output is correct
14 Correct 122 ms 75348 KB Output is correct
15 Correct 132 ms 75476 KB Output is correct
16 Correct 297 ms 45040 KB Output is correct
17 Correct 243 ms 44116 KB Output is correct
18 Correct 248 ms 44612 KB Output is correct
19 Correct 142 ms 46416 KB Output is correct
20 Correct 138 ms 46500 KB Output is correct
21 Correct 140 ms 46676 KB Output is correct
22 Correct 138 ms 46384 KB Output is correct
23 Correct 298 ms 45312 KB Output is correct
24 Correct 207 ms 49052 KB Output is correct
25 Correct 156 ms 43348 KB Output is correct
26 Correct 147 ms 41556 KB Output is correct
27 Correct 142 ms 41812 KB Output is correct
28 Incorrect 163 ms 43852 KB Output isn't correct
29 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 14428 KB Output is correct
2 Correct 7 ms 14428 KB Output is correct
3 Correct 7 ms 14428 KB Output is correct
4 Correct 6 ms 14428 KB Output is correct
5 Correct 6 ms 14424 KB Output is correct
6 Correct 6 ms 14612 KB Output is correct
7 Correct 7 ms 14428 KB Output is correct
8 Correct 6 ms 14584 KB Output is correct
9 Correct 7 ms 14684 KB Output is correct
10 Correct 10 ms 14836 KB Output is correct
11 Correct 7 ms 14684 KB Output is correct
12 Correct 7 ms 14684 KB Output is correct
13 Correct 7 ms 14752 KB Output is correct
14 Correct 8 ms 14684 KB Output is correct
15 Correct 7 ms 14684 KB Output is correct
16 Correct 8 ms 14684 KB Output is correct
17 Correct 653 ms 51024 KB Output is correct
18 Correct 638 ms 51028 KB Output is correct
19 Correct 667 ms 50652 KB Output is correct
20 Correct 648 ms 51028 KB Output is correct
21 Correct 636 ms 51020 KB Output is correct
22 Correct 727 ms 51792 KB Output is correct
23 Correct 652 ms 51540 KB Output is correct
24 Correct 699 ms 51824 KB Output is correct
25 Correct 672 ms 51792 KB Output is correct
26 Correct 642 ms 51340 KB Output is correct
27 Correct 704 ms 51024 KB Output is correct
28 Correct 621 ms 51540 KB Output is correct
29 Correct 611 ms 51236 KB Output is correct
30 Correct 648 ms 51196 KB Output is correct
31 Correct 720 ms 51176 KB Output is correct
32 Correct 611 ms 51460 KB Output is correct
33 Correct 241 ms 44992 KB Output is correct
34 Correct 151 ms 46424 KB Output is correct
35 Correct 186 ms 59732 KB Output is correct
36 Correct 189 ms 59880 KB Output is correct
37 Correct 174 ms 59848 KB Output is correct
38 Correct 179 ms 59732 KB Output is correct
39 Correct 193 ms 59832 KB Output is correct
40 Correct 177 ms 59884 KB Output is correct
41 Correct 184 ms 59740 KB Output is correct
42 Correct 181 ms 60240 KB Output is correct
43 Correct 188 ms 59960 KB Output is correct
44 Correct 215 ms 45152 KB Output is correct
45 Correct 182 ms 59988 KB Output is correct
46 Correct 122 ms 75348 KB Output is correct
47 Correct 132 ms 75476 KB Output is correct
48 Correct 297 ms 45040 KB Output is correct
49 Correct 243 ms 44116 KB Output is correct
50 Correct 248 ms 44612 KB Output is correct
51 Correct 142 ms 46416 KB Output is correct
52 Correct 138 ms 46500 KB Output is correct
53 Correct 140 ms 46676 KB Output is correct
54 Correct 138 ms 46384 KB Output is correct
55 Correct 298 ms 45312 KB Output is correct
56 Correct 207 ms 49052 KB Output is correct
57 Correct 156 ms 43348 KB Output is correct
58 Correct 147 ms 41556 KB Output is correct
59 Correct 142 ms 41812 KB Output is correct
60 Incorrect 163 ms 43852 KB Output isn't correct
61 Halted 0 ms 0 KB -