제출 #1287049

#제출 시각아이디문제언어결과실행 시간메모리
1287049modwwe은하철도 (APIO24_train)C++20
100 / 100
403 ms90508 KiB
#pragma GCC optimize("Ofast,unroll-loops") #include "train.h" #include <bits/stdc++.h> //#define int long long #define ll long long #define down cout<<'\n'; #define debug cout<<" cucuucucuuu",down #define modwwe int t;cin>>t; while(t--) #define bit(i,j) (i>>j&1) #define sobit(a) __builtin_popcountll(a) #define task2 "facttree" #define task "test" #define fin(x) freopen(x".inp","r",stdin) #define fou(x) freopen(x".out","w",stdout) #define pb push_back #define mask(k) (1ll<<k) #define checktime cerr << (double)clock() / CLOCKS_PER_SEC * 1000 << " ms"; using namespace std; #define getchar_unlocked getchar mt19937 rd(chrono::steady_clock::now().time_since_epoch().count()); int rand(int l, int r) { return uniform_int_distribution<int>(l, r)(rd); } void phongbeo(); const ll inf = 1e17; const int mod2 = 998244353; //const ll base=67; ll n, m, s1, s2, s4, s3, sf, k, s5, s6, s7, s8, s9, mx2, res, dem2 = 0, dem = 0, s33, dem3, dem4, mid, l2, r2, center; int i, s10, s12, k1, k2, k3, s11, lim, w, l, r, dem5, dem6, dem7, dem9, root, en; int el = 19; struct ib { ll a, b; }; vector<ll> dp[100007], dp2[100007], vc[100007], gl, gr, vx[100007], vd[100007]; vector<ib> dc, hihi; int base = 0; struct id { ll l, r; }; struct ic { ll a, b, c; }; vector<vector<ic>>v[100007]; int f[100007], t[100007]; bool cmp(ib x, ib y) { return x.a < y.a; } bool cmk(ib x, ib y) { return x.b < y.b; } struct perseg { ll t[6000001]; id cur[6000001]; int upd(int u, int l, int r, int x) { int v = ++dem; if (l == r) { t[v] = t[u] + 1; return v; } int mid = l + r >> 1; cur[v] = cur[u]; if (x <= mid) cur[v].l = upd(cur[u].l, l, mid, x); else cur[v].r = upd(cur[u].r, mid + 1, r, x); t[v] = t[cur[v].l] + t[cur[v].r]; return v; } ll get(int u, int l, int r, int l1, int r1) { if (l > r1 || r < l1) return 0; if (l >= l1 && r <= r1) return t[u]; int mid = l + r >> 1; return get(cur[u].l, l, mid, l1, r1) + get(cur[u].r, mid + 1, r, l1, r1); } int walk(int u, int v, int l, int r, ll x, ll y, ll ggg) { if (l == r) return l; int mid = l + r >> 1; if (t[cur[u].l]*ggg + x >= t[cur[v].l]*ggg + y) return walk(cur[u].l, cur[v].l, l, mid, x, y, ggg); return walk(cur[u].r, cur[v].r, mid + 1, r, x + t[cur[u].l] * ggg, y + t[cur[v].l] * ggg, ggg); } } st; ll cost(int x, int y, int z) { return dp2[x][y] + st.get(f[upper_bound(gl.begin(), gl.end(), vc[x][y]) - gl.begin()], -1, gr.size(), 1, lower_bound(gr.begin(), gr.end(), vc[x][z]) - gr.begin()) * t[x]; } void huff(int x, int y) { if (vd[x].size() == 0) return; int kk = lower_bound(gr.begin(), gr.end(), vc[x][y]) - gr.begin(); int hihi = upper_bound(vd[x].begin(), vd[x].end(), kk) - vd[x].begin() - 1; int ff = vx[x][hihi]; dp[x][y] = min(dp[x][y], cost(x, ff, y)); } int fx(int x, int y, int z) { int k1 = upper_bound(gl.begin(), gl.end(), vc[x][y]) - gl.begin(); int k2 = upper_bound(gl.begin(), gl.end(), vc[x][z]) - gl.begin(); if (dp2[x][y] + st.t[f[k1]]*t[x] < dp2[x][z] + st.t[f[k2]]*t[x]) return -2; return st.walk(f[k1], f[k2], -1, gr.size(), dp2[x][y], dp2[x][z], t[x]); } void buff(int x, int y) { int nxt = 0; while (true) { if (vx[x].size() == 0) break; int hihi = vx[x].back(); int gf = fx(x, hihi, y); nxt = gf; if (gf >= vd[x].back() || nxt == -2) break; vx[x].pop_back(); vd[x].pop_back(); } if (nxt != -2) { if (vx[x].size() == 0) nxt = 0; vx[x].pb(y); vd[x].pb(nxt); } } ll solve(int N, int M, int K, vector<int> T, vector<int> X, vector<int> Y, vector<int> a, vector<int> b, vector<int> c, vector<int> fl, vector<int> fr) { n = N; m = M; k = K; for (int i = 1; i <= n; i++) t[i] = T[i - 1]; dc.pb({1, -1}); vc[1].pb({-1}); vc[n].pb({inf}); dc.pb({n, inf}); /* for(int i=1; i<=m; i++) cin>>X[i]; for(int i=1; i<=m; i++) cin>>Y[i]; for(int i=1; i<=m; i++) cin>>a[i]; for(int i=1; i<=m; i++) cin>>b[i]; for(int i=1; i<=m; i++) cin>>c[i];*/ for (int i = 0; i < m; i++) { //cin>>X[i]>>Y[i]>>a[i]>>b[i]>>c[i]; X[i]++; Y[i]++; vc[X[i]].pb(a[i]); vc[Y[i]].pb(b[i]); dc.pb({X[i], a[i]}); dc.pb({Y[i], b[i]}); }/* for(int i=1; i<=k; i++) cin>>fl[i]; for(int i=1; i<=k; i++) cin>>fr[i];*/ gl.pb(inf + 1); gr.pb(inf + 1); hihi.pb({inf + 1, inf + 1}); for (int i = 1; i <= k; i++) { l = fl[i - 1]; r = fr[i - 1]; gl.pb(l); gr.pb(r); hihi.pb({l, r}); } sort(hihi.begin(), hihi.end(), cmp); sort(gl.begin(), gl.end()); sort(gr.begin(), gr.end()); gr.erase(unique(gr.begin(), gr.end()), gr.end()); for (int i = gl.size() - 1; i >= 0; --i) { base = st.upd(base, -1, gr.size(), lower_bound(gr.begin(), gr.end(), hihi[i].b) - gr.begin() + 1); f[i] = base; } for (int i = 1; i <= n; i++) { if (vc[i].size()) { sort(vc[i].begin(), vc[i].end()); vc[i].erase(unique(vc[i].begin(), vc[i].end()), vc[i].end()); v[i].resize(vc[i].size()); dp[i].resize(vc[i].size()); dp2[i].resize(vc[i].size()); for (int j = 0; j < dp[i].size(); j++) dp[i][j] = dp2[i][j] = inf; } } for (int i = 0; i < m; i++) { v[X[i]][lower_bound(vc[X[i]].begin(), vc[X[i]].end(), a[i]) - vc[X[i]].begin()] .pb({Y[i], lower_bound(vc[Y[i]].begin(), vc[Y[i]].end(), b[i]) - vc[Y[i]].begin(), c[i]}); } sort(dc.begin(), dc.end(), cmk); dp2[1][0] = 0; dp[1][0] = 0; for (auto x : dc) { x.b = lower_bound(vc[x.a].begin(), vc[x.a].end(), x.b) - vc[x.a].begin(); huff(x.a, x.b); buff(x.a, x.b); for (auto y : v[x.a][x.b]) { dp2[y.a][y.b] = min(dp2[y.a][y.b], min(dp2[x.a][x.b], dp[x.a][x.b]) + y.c); dp[y.a][y.b] = min(dp[y.a][y.b], dp2[y.a][y.b]); } } if (min(dp2[n].back(), dp[n].back()) == inf) return -1; else return min(dp2[n].back(), dp[n].back()); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...