제출 #1083748

#제출 시각아이디문제언어결과실행 시간메모리
1083748phongConstellation 3 (JOI20_constellation3)C++17
35 / 100
1548 ms98360 KiB
#include<bits/stdc++.h> #define ll long long #define int long long const int nmax = 2e5 + 5, N = 1e5; const ll oo = 1e18 + 1, base = 311; const int lg = 20, M = 10; const ll mod = 998244353, mod2 = 1e9 + 5277; #define pii pair<int, int> #define fi first #define se second #define endl "\n" #define debug(a, n) for(int i = 1; i <= n; ++i) cout << a[i] << ' '; cout << "\n"; using namespace std; int n, m; int rmq[nmax][lg + 1], a[nmax]; map<int, int> dp[nmax], g[nmax]; ll f[nmax]; int calc(int u, int j){ // if(f[u] < g[u][j]) cout << "?"; dp[u][j] += f[u] - g[u][j]; g[u][j] = f[u]; return dp[u][j]; } int get(int l, int r){ int k = __lg(r - l + 1); int x = rmq[l][k], y = rmq[r - (1 << k) + 1][k]; if(a[x] > a[y])return x; else return y; } int one[nmax]; int get(int u){ return one[u] ? one[u] = get(one[u]) : u; } int lmao(int x, int y){ ll res = 0; while(dp[x].size()){ pii it = *dp[x].begin(); if(it.fi <= y){ res = max(res, calc(x, it.fi)); dp[x].erase(dp[x].begin()); } else break; } return res; } int solve(int l, int r){ if(l == r) return l; int p = get(l, r); if(l < p && p < r){ int x = get(solve(l, p - 1)); int y = get(solve(p + 1, r)); if(dp[x].size() > dp[y].size()) swap(x, y); one[x] = y; int t1 = lmao(x, a[p]); int t2 = lmao(y, a[p]); for(auto [id, w] : dp[y]) dp[y][id] += t1; vector<int> tmp; for(auto [id, w] : dp[x]){ tmp.push_back(id); } // cout <<t1 << ' ' << t2 << endl; for(auto id : tmp){ dp[y][id] = max(calc(x, id) + t2, calc(y, id)); // g[y][id] += t1; } // f[y] += t1; one[p] = y; for(auto [id, w] : dp[p]){ dp[y][id] = max(calc(y, id), w + t1 + t2); } dp[y][a[p]] = t1 + t2; // g[y][a[p]] += t1; // for(auto [id, w] : dp[y]){ // calc(y, id); // } // cout << p << "#\n"; // for(auto [id, w] : dp[y]) cout << id << ' ' << w << endl; // exit(0); } else{ int y; if(l < p)y = get(solve(l, p - 1)); else y = get(solve(p + 1, r)); int t1 = lmao(y, a[p]); one[p] = y; for(auto [id, w] : dp[p]){ dp[y][id] = max(calc(y, id), w + t1); } dp[y][a[p]] = t1; for(auto [id, w] : dp[y]){ calc(y, id); } } return p; } main(){ ios_base::sync_with_stdio(0); cin.tie(0);cout.tie(0); // freopen("code.inp", "r", stdin); // freopen("code.out", "w", stdout); cin >> n; for(int i = 1; i <= n; ++i) cin >> a[i], rmq[i][0] = i; for(int j = 1; j <= lg; ++j){ for(int i = 1; i + (1 << j) - 1 <= n; ++i){ int x = rmq[i][j - 1], y = rmq[i + (1 << (j - 1))][j - 1]; if(a[x] > a[y]) rmq[i][j] = x; else rmq[i][j] = y; } } cin >> m; ll sum = 0; for(int i = 1, u, v, w; i <= m; ++i){ cin >> u >> v >> w; dp[u][v] = w; sum += w; } int p = get(solve(1, n)); ll ans = 0; for(auto [id,w] : dp[p]) ans = max(ans, calc(p, id)); cout << sum - ans; } /* 6# 1 30 2 30 3 30 4 30 5 30 6 37 7 30 8 39 4# 1 37 2 37 3 37 4 37 5 37 6 37 7 37 8 39 2# 1 52 2 52 3 52 4 52 5 52 6 52 7 52 8 52 */

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

constellation3.cpp:104:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
  104 | main(){
      | ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...