답안 #789959

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
789959 2023-07-22T08:19:00 Z TB_ Toll (BOI17_toll) C++17
100 / 100
217 ms 14412 KB
#include <bits/stdc++.h>
using namespace std;

// #undef _GLIBCXX_DEBUG                // disable run-time bound checking, etc
// #pragma GCC optimize("Ofast,inline") // Ofast = O3,fast-math,allow-store-data-races,no-protect-parens
// #pragma GCC optimize ("unroll-loops")

// #pragma GCC target("bmi,bmi2,lzcnt,popcnt")                      // bit manipulation
// #pragma GCC target("movbe")                                      // byte swap
// #pragma GCC target("aes,pclmul,rdrnd")                           // encryption
// #pragma GCC target("avx,avx2,f16c,fma,sse3,ssse3,sse4.1,sse4.2") // SIMD

// #include <bits/extc++.h>
// using namespace __gnu_pbds;
// template<class T>using ordered_set = tree<T, null_type, less<T>, rb_tree_tag,tree_order_statistics_node_update>;
// template<class T>using ordered_multiset = tree<T, null_type, less_equal<T>, rb_tree_tag,tree_order_statistics_node_update>;

#define ll long long
#define INF (ll)1e9+7
#define fo(i, n) for(int i=0;i<n;i++)
#define deb(x) cout << #x << " = " << x << endl;
#define deb2(x, y) cout << #x << " = " << x << ", " << #y << " = " << y << endl
#define pb push_back
#define mp make_pair
#define F first
#define S second
#define LSOne(S) ((S) & (-S))
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
inline int readint(){ int v = 0; char c; while((c = getchar()) != EOF && c != ' ' && c != '\n'){ v *= 10; v += c - '0'; } return v; }
inline int readintsigned() { int v = 0; int sign = 1; char c = getchar(); if (c == '-') { sign = -1; } else { v += c - '0'; } while ((c = getchar()) != EOF && c != ' ' && c != '\n') { v *= 10; v += c - '0'; } return v * sign; }
inline string readstring() { string s; char c; while ((c = getchar()) != EOF && c != '\n' && c != ' ') { s.push_back(c); } return s; }
template <class result_t=std::chrono::milliseconds,class clock_t=std::chrono::steady_clock,class duration_t = std::chrono::milliseconds>
auto since(std::chrono::time_point<clock_t, duration_t> const& start){return std::chrono::duration_cast<result_t>(clock_t::now() - start);}
typedef pair<int, int> pii;
typedef pair<ll, ll> pl;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<pii> vpii;
typedef vector<pl> vpl;
typedef vector<vi> vvi;
typedef vector<vl> vvl;
typedef vector<vpii> vvpii;
typedef vector<vpl> vvpl;

vvpl adj(50001);

int k, n, m, o, from, to, t;

vvl memo(50001, vl(5, 1e16));
int seen[50001];

vl dfs(int u){
    if(u == n-5) return vl(5, 1e16);
    vl &res = memo[u];
    if(seen[u]) return res;
    seen[u] = 1;
    if((u/k)%((int)sqrt(n/k)) == ((int)sqrt(n/k)-1)) res = vl(5, 1e16);
    for(auto v : adj[u]){
        vl temp = dfs(v.F);
        if((u/k)%((int)sqrt(n/k)) == ((int)sqrt(n/k))-1){
            res[v.F%k] = v.S;
            continue;
        }
        fo(i, k) {
            res[i] = min(res[i], temp[i]+v.S);
        }
    }
    return res;
}

int main() {
    // cout << fixed << setprecision(20);
    // auto start = std::chrono::steady_clock::now(); // since(start).count()
    cin.tie(0)->sync_with_stdio(0);

    cin >> k >> n >> m >> o;
    n+=5;
    fo(i, m){
        cin >> from >> to >> t;
        adj[from].pb({to, t});
    }

    memset(seen, 0, sizeof(seen));
    ll tempAdd = 0;
    while(tempAdd<n-5){
        fo(i, k) dfs(i+tempAdd);
        tempAdd+=k*((int)sqrt(n/k));
    }

    vl temp = memo[0];

    fo(x, o){
        // deb(x);
        cin >> from >> to;
        if(from == to) {
            cout << "0\n";
            continue;
        }else if(to < from){
            cout << "-1\n";
            continue;
        }
        
        vl currentToll(5, 1e16);
        currentToll[from%k] = 0;
        ll pos = from/k;
        if((from/k)/((int)sqrt(n/k))+1 < (to/k)/((int)sqrt(n/k))){
            ll toAdd = ((int)sqrt(n/k)-(pos%((int)sqrt(n/k))));
            fo(i, toAdd){
                vl newToll(5, 1e16);
                fo(j, k){
                    for(auto v : adj[pos*k+j]){
                        newToll[v.F%k] = min(newToll[v.F%k], currentToll[j]+v.S);
                    }
                }
                currentToll = newToll;
                pos++;
            }
            while((pos)/((int)sqrt(n/k)) < (to/k)/((int)sqrt(n/k))){
                vl newToll(5, 1e16);
                fo(i, k){
                    fo(j, k){
                        newToll[j] = min(newToll[j], currentToll[i]+memo[i+pos*k][j]);
                    }
                }
                currentToll = newToll;
                pos+=(int)sqrt(n/k);
            }
        } 
        while(pos < to/k){
            // deb(pos);
            vl newToll(5, 1e16);
            fo(j, k){
                for(auto v : adj[pos*k+j]){
                    newToll[v.F%k] = min(newToll[v.F%k], currentToll[j]+v.S);
                }
            }
            currentToll = newToll;
            pos++;
        }
        ll ans = currentToll[to%k];
        cout << ((ans>=((ll)1e16))?-1:ans) << "\n"; 
    }


    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 126 ms 14052 KB Output is correct
2 Correct 4 ms 5204 KB Output is correct
3 Correct 4 ms 5204 KB Output is correct
4 Correct 4 ms 5204 KB Output is correct
5 Correct 5 ms 5212 KB Output is correct
6 Correct 5 ms 5204 KB Output is correct
7 Correct 5 ms 5176 KB Output is correct
8 Correct 117 ms 8084 KB Output is correct
9 Correct 111 ms 7616 KB Output is correct
10 Correct 82 ms 5580 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 163 ms 10956 KB Output is correct
2 Correct 4 ms 5112 KB Output is correct
3 Correct 4 ms 5204 KB Output is correct
4 Correct 3 ms 5204 KB Output is correct
5 Correct 4 ms 5168 KB Output is correct
6 Correct 4 ms 5164 KB Output is correct
7 Correct 21 ms 5332 KB Output is correct
8 Correct 21 ms 5488 KB Output is correct
9 Correct 152 ms 8120 KB Output is correct
10 Correct 199 ms 13536 KB Output is correct
11 Correct 168 ms 12748 KB Output is correct
12 Correct 144 ms 8588 KB Output is correct
13 Correct 119 ms 13240 KB Output is correct
14 Correct 67 ms 10492 KB Output is correct
15 Correct 76 ms 9184 KB Output is correct
16 Correct 66 ms 9116 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 5204 KB Output is correct
2 Correct 3 ms 5204 KB Output is correct
3 Correct 3 ms 5204 KB Output is correct
4 Correct 3 ms 5160 KB Output is correct
5 Correct 4 ms 5204 KB Output is correct
6 Correct 4 ms 5204 KB Output is correct
7 Correct 4 ms 5332 KB Output is correct
8 Correct 5 ms 5332 KB Output is correct
9 Correct 4 ms 5332 KB Output is correct
10 Correct 19 ms 8020 KB Output is correct
11 Correct 31 ms 12372 KB Output is correct
12 Correct 42 ms 13356 KB Output is correct
13 Correct 48 ms 14028 KB Output is correct
14 Correct 47 ms 12204 KB Output is correct
15 Correct 24 ms 9144 KB Output is correct
16 Correct 25 ms 9048 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 5204 KB Output is correct
2 Correct 3 ms 5204 KB Output is correct
3 Correct 3 ms 5204 KB Output is correct
4 Correct 3 ms 5160 KB Output is correct
5 Correct 4 ms 5204 KB Output is correct
6 Correct 4 ms 5204 KB Output is correct
7 Correct 4 ms 5332 KB Output is correct
8 Correct 5 ms 5332 KB Output is correct
9 Correct 4 ms 5332 KB Output is correct
10 Correct 19 ms 8020 KB Output is correct
11 Correct 31 ms 12372 KB Output is correct
12 Correct 42 ms 13356 KB Output is correct
13 Correct 48 ms 14028 KB Output is correct
14 Correct 47 ms 12204 KB Output is correct
15 Correct 24 ms 9144 KB Output is correct
16 Correct 25 ms 9048 KB Output is correct
17 Correct 61 ms 12420 KB Output is correct
18 Correct 3 ms 5204 KB Output is correct
19 Correct 3 ms 5164 KB Output is correct
20 Correct 3 ms 5204 KB Output is correct
21 Correct 3 ms 5204 KB Output is correct
22 Correct 3 ms 5160 KB Output is correct
23 Correct 8 ms 5328 KB Output is correct
24 Correct 8 ms 5404 KB Output is correct
25 Correct 14 ms 5384 KB Output is correct
26 Correct 9 ms 5428 KB Output is correct
27 Correct 48 ms 8036 KB Output is correct
28 Correct 77 ms 13428 KB Output is correct
29 Correct 84 ms 14040 KB Output is correct
30 Correct 70 ms 11280 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 126 ms 14052 KB Output is correct
2 Correct 4 ms 5204 KB Output is correct
3 Correct 4 ms 5204 KB Output is correct
4 Correct 4 ms 5204 KB Output is correct
5 Correct 5 ms 5212 KB Output is correct
6 Correct 5 ms 5204 KB Output is correct
7 Correct 5 ms 5176 KB Output is correct
8 Correct 117 ms 8084 KB Output is correct
9 Correct 111 ms 7616 KB Output is correct
10 Correct 82 ms 5580 KB Output is correct
11 Correct 163 ms 10956 KB Output is correct
12 Correct 4 ms 5112 KB Output is correct
13 Correct 4 ms 5204 KB Output is correct
14 Correct 3 ms 5204 KB Output is correct
15 Correct 4 ms 5168 KB Output is correct
16 Correct 4 ms 5164 KB Output is correct
17 Correct 21 ms 5332 KB Output is correct
18 Correct 21 ms 5488 KB Output is correct
19 Correct 152 ms 8120 KB Output is correct
20 Correct 199 ms 13536 KB Output is correct
21 Correct 168 ms 12748 KB Output is correct
22 Correct 144 ms 8588 KB Output is correct
23 Correct 119 ms 13240 KB Output is correct
24 Correct 67 ms 10492 KB Output is correct
25 Correct 76 ms 9184 KB Output is correct
26 Correct 66 ms 9116 KB Output is correct
27 Correct 4 ms 5204 KB Output is correct
28 Correct 3 ms 5204 KB Output is correct
29 Correct 3 ms 5204 KB Output is correct
30 Correct 3 ms 5160 KB Output is correct
31 Correct 4 ms 5204 KB Output is correct
32 Correct 4 ms 5204 KB Output is correct
33 Correct 4 ms 5332 KB Output is correct
34 Correct 5 ms 5332 KB Output is correct
35 Correct 4 ms 5332 KB Output is correct
36 Correct 19 ms 8020 KB Output is correct
37 Correct 31 ms 12372 KB Output is correct
38 Correct 42 ms 13356 KB Output is correct
39 Correct 48 ms 14028 KB Output is correct
40 Correct 47 ms 12204 KB Output is correct
41 Correct 24 ms 9144 KB Output is correct
42 Correct 25 ms 9048 KB Output is correct
43 Correct 61 ms 12420 KB Output is correct
44 Correct 3 ms 5204 KB Output is correct
45 Correct 3 ms 5164 KB Output is correct
46 Correct 3 ms 5204 KB Output is correct
47 Correct 3 ms 5204 KB Output is correct
48 Correct 3 ms 5160 KB Output is correct
49 Correct 8 ms 5328 KB Output is correct
50 Correct 8 ms 5404 KB Output is correct
51 Correct 14 ms 5384 KB Output is correct
52 Correct 9 ms 5428 KB Output is correct
53 Correct 48 ms 8036 KB Output is correct
54 Correct 77 ms 13428 KB Output is correct
55 Correct 84 ms 14040 KB Output is correct
56 Correct 70 ms 11280 KB Output is correct
57 Correct 217 ms 14412 KB Output is correct
58 Correct 112 ms 8176 KB Output is correct
59 Correct 146 ms 12800 KB Output is correct