Submission #1221262

#TimeUsernameProblemLanguageResultExecution timeMemory
1221262amine_arouaWild Boar (JOI18_wild_boar)C++20
0 / 100
46 ms94528 KiB
#include<bits/stdc++.h> // #pragma GCC optimize("O3" , "unroll-loops") // #include <ext/pb_ds/assoc_container.hpp> using namespace std; // using namespace __gnu_pbds; // template <class T> // using Tree = tree<T, null_type, less_equal<T>, rb_tree_tag, tree_order_statistics_node_update>; #define int long long int floor_div(int x, int y) { assert(y != 0); if (y < 0) { y = -y; x = -x; } if (x >= 0) return x / y; return (x + 1) / y - 1; } int ceil_div(int x, int y) { assert(y != 0); if (y < 0) { y = -y; x = -x; } if (x <= 0) return x / y; return (x - 1) / y + 1; } const int N = 2000; const int C = 3; const int L = (1<<17); const int INF = 1e18; int n , m , t , l; vector<pair<int ,int>> adj[N + 1]; int invadj[N + 1][N + 1]; vector<vector<int>> dist[N+1][N+1]; void run_case() { cin>>n>>m>>t>>l; for(int i = 1 ; i <= n ;i++) { invadj[i][0] = 0; adj[i].push_back({0 , 0}); } for(int i = 0 ; i < m ;i++) { int u , v , c; cin>>u>>v>>c; invadj[u][v] = (int)adj[u].size(); adj[u].push_back({v , c}); invadj[v][u] = (int)adj[v].size(); adj[v].push_back({u , c}); } for(int i = 1 ;i <= n ; i++) { for(int j = 1 ; j <= n ; j++) { dist[i][j].assign((int)adj[i].size() , vector<int>((int)adj[j].size() , INF)); } } for(int i = 1 ; i <= n ; i++) { for(int j = 0 ; j < (int)adj[i].size() ; j++) { priority_queue<pair<int , pair<int ,int>>> pq; dist[i][i][j][j] = 0; pq.push({0 , {j , i}}); vector<vector<bool>> vis(m + 1 , vector<bool>(n + 1)); while(!pq.empty()) { auto tp = pq.top(); pq.pop(); int d = -tp.first; auto [edgprv , cur] = tp.second; if(vis[edgprv][cur]) continue; vis[edgprv][cur] = 1; int prv = adj[cur][edgprv].first; for(auto [u , c] : adj[cur]) { if(u != prv && u) { int edgu = invadj[u][cur]; if(dist[i][u][j][edgu] > d + c) { dist[i][u][j][edgu] = d + c; pq.push({-(d + c) , {edgu , u}}); } } } } } } vector<vector<int>> dp(l , vector<int>(m + 1 , INF)); vector<int> x(l); for(auto &u : x) cin>>u; int p , q; cin>>p>>q; p--; x[p] = q; dp[0][0] = 0; int ans = INF; for(int i = 1 ; i < l ; i++) { int u = x[i] , v = x[i - 1]; for(int prvu = 1 ; prvu < (int) adj[u].size() ; prvu++) { for(int prvv = 0 ; prvv < (int)adj[v].size() ; prvv++) { dp[i][prvu] = min(dp[i][prvu] , dp[i - 1][prvv]+ dist[v][u][prvv][prvu]); } if(i == l - 1) ans = min(ans , dp[i][prvu]); } } cout<<ans<<'\n'; } signed main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t = 1; // cin>>t; while(t--) { run_case(); } } // THINK OF DP ! // KEEP TRACK OF TIME !
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...