제출 #716003

#제출 시각아이디문제언어결과실행 시간메모리
716003sandry24Toll (BOI17_toll)C++17
100 / 100
158 ms85296 KiB
#include <bits/stdc++.h>
using namespace std;
 
//#pragma GCC optimize("O3,unroll-loops")
//#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pi;
#define pb push_back
#define mp make_pair
#define f first
#define s second

int k, n, m, o;
int ans[5][5], temp[5][5], dp[50000][17][5][5];

void combine(int t[5][5], int a[5][5], int b[5][5]){
    for(int i = 0; i < k; i++){
        for(int j = 0; j < k; j++){
            for(int l = 0; l < k; l++){
                t[i][j] = min(t[i][j], a[i][l] + b[l][j]);
            }
        }
    }
}
 
void solve(){
cin >> k >> n >> m >> o;

    memset(dp, 0x3f, sizeof dp);

    while (m--) {

        int a, b, t;

        cin >> a >> b >> t;

        dp[a / k][0][a % k][b % k] = t;

    }

    for (int j = 1; j < 17; j++) {

        for (int i = 0; i + (1 << j) < (n + k - 1) / k; i++) {

            combine(dp[i][j], dp[i][j - 1], dp[i + (1 << j - 1)][j - 1]);

        }

    }


    while (o--) {

        int a, b;

        cin >> a >> b;

        memset(ans, 0x3f, sizeof ans);

        for (int i = 0; i < 5; i++) ans[i][i] = 0;

        for (int curr = a / k, dest = b / k, i = 16; ~i; i--) {

            if (curr + (1 << i) <= dest) {

                memset(temp, 0x3f, sizeof temp);

                combine(temp, ans, dp[curr][i]);

                memcpy(ans, temp, sizeof ans);

                curr += (1 << i);

            }

        }

        cout << (ans[a % k][b % k] == 0x3f3f3f3f ? -1 : ans[a % k][b % k])

             << '\n';

    }
}   

int main(){
    //freopen("infasuratoare.in", "r", stdin);
    //freopen("infasuratoare.out", "w", stdout);
    ios::sync_with_stdio(0); cin.tie(0);
    int t = 1;
    //cin >> t;
    while(t--){
        solve();
    }
}

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

toll.cpp: In function 'void solve()':
toll.cpp:46:60: warning: suggest parentheses around '-' inside '<<' [-Wparentheses]
   46 |             combine(dp[i][j], dp[i][j - 1], dp[i + (1 << j - 1)][j - 1]);
      |                                                          ~~^~~
#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...