Submission #1167474

#TimeUsernameProblemLanguageResultExecution timeMemory
1167474yeediotEscape Route 2 (JOI24_escape2)C++20
100 / 100
1738 ms41328 KiB
#include<bits/stdc++.h> using namespace std; #define int long long #define F first #define S second #define all(x) x.begin(),x.end() #define pii pair<int,int> #define pb push_back #define sz(x) (int)(x.size()) #define chmin(x,y) x=min(x,y) #define chmax(x,y) x=max(x,y) #define vi vector<int> #define vp vector<pii> #define vvi vector<vi> #define ykh mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count()) #define __lg(x) 63-__builtin_clzll(x) #define pow2(x) (1LL<<x) void __print(int x) {cerr << x;} void __print(float x) {cerr << x;} void __print(double x) {cerr << x;} void __print(long double x) {cerr << x;} void __print(char x) {cerr << '\'' << x << '\'';} void __print(const char *x) {cerr << '\"' << x << '\"';} void __print(const string &x) {cerr << '\"' << x << '\"';} void __print(bool x) {cerr << (x ? "true" : "false");} template<typename T, typename V> void __print(const pair<T, V> &x) {cerr << '{'; __print(x.first); cerr << ','; __print(x.second); cerr << '}';} template<typename T> void __print(const T &x) {int f = 0; cerr << '{'; for (auto &i: x) cerr << (f++ ? "," : ""), __print(i); cerr << "}";} void _print() {cerr << "]\n";} template <typename T, typename... V> void _print(T t, V... v) {__print(t); if (sizeof...(v)) cerr << ", "; _print(v...);} #ifdef local void CHECK(); void setio(){ freopen("/Users/iantsai/cpp/input.txt","r",stdin); freopen("/Users/iantsai/cpp/output.txt","w",stdout); } #define debug(x...) cerr << "[" << #x << "] = ["; _print(x) #else void setio(){} #define debug(x...) #endif #define TOI_is_so_de ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);setio(); const int blk = 800, mxn = 1e5 + 5, inf = 1e18; int c[mxn], tmr = 0, jump[20][mxn], sum[20][mxn], bid[mxn], cnt = 0, dis[mxn / blk][mxn]; vector<pii>v[mxn]; vector<int>id[mxn]; void solve(){ int n, t, q; cin >> n >> t; for(int i = 1; i < n; i++){ cin >> c[i]; for(int j = 1; j <= c[i]; j++){ int l, r; cin >> l >> r; v[i].pb({l, r}); } sort(all(v[i])); } v[n].pb({0, 0}); for(int i = 1; i <= n; i++){ vector<pii>st; for(auto [l, r] : v[i]){ while(sz(st) and st.back().S >= r){ st.pop_back(); } st.pb({l, r}); } for(int j = 0; j < sz(st); j++){ id[i].pb(++tmr); } v[i] = st; } for(int i = 1; i < n; i++){ for(int j = 0; j < sz(v[i]); j++){ if(v[i][j].S <= v[i + 1].back().F){ jump[0][id[i][j]] = lower_bound(all(v[i + 1]), make_pair(v[i][j].S, 0LL)) - v[i + 1].begin(); sum[0][id[i][j]] = v[i + 1][jump[0][id[i][j]]].F - v[i][j].F; } else{ jump[0][id[i][j]] = 0; sum[0][id[i][j]] = v[i + 1][0].F + t - v[i][j].F; } } } for(int i = 1; i < 20; i++){ for(int j = 1; j < n; j++){ for(int k = 0; k < sz(v[j]); k++){ if(j + (1 << i) - 1 <= n){ int v = id[j + (1 << i - 1)][jump[i - 1][id[j][k]]]; jump[i][id[j][k]] = jump[i - 1][v]; sum[i][id[j][k]] = sum[i - 1][id[j][k]] + sum[i - 1][v]; } } } } for(int i = 1; i < n; i++){ if(sz(v[i]) < blk) continue; bid[i] = ++cnt; vector<int>dp(sz(v[i]), 0); for(int j = i + 1; j <= n; j++){ dis[cnt][j] = inf; vector<int>ndp(sz(v[j]), inf); for(int k = 0; k < sz(v[j - 1]); k++){ chmin(dis[cnt][j], dp[k] + v[j - 1][k].S - v[j - 1][k].F); chmin(ndp[jump[0][id[j - 1][k]]], dp[k] + sum[0][id[j - 1][k]]); } dp = ndp; } } cin >> q; while(q--){ int l, r, ans = inf; cin >> l >> r; auto qry = [&](int idx, int l, int r){ int dif = r - l - 1, res = 0, cur = l; for(int i = 19; i >= 0; i--){ if(dif >> i & 1){ res += sum[i][id[cur][idx]]; idx = jump[i][id[cur][idx]]; cur = cur + (1 << i); } } return res + v[r - 1][idx].S - v[r - 1][idx].F; }; if(sz(v[l]) < blk){ for(int i = 0; i < sz(v[l]); i++){ chmin(ans, qry(i, l, r)); } } else{ ans = dis[bid[l]][r]; } cout << ans << '\n'; } } signed main(){ TOI_is_so_de; int t = 1; //cin >> t; while(t--){ solve(); } #ifdef local CHECK(); #endif } /* input: */ #ifdef local void CHECK(){ cerr << "\n[Time]: " << 1000.0 * clock() / CLOCKS_PER_SEC << " ms.\n"; function<bool(string,string)> compareFiles = [](string p1, string p2)->bool { std::ifstream file1(p1); std::ifstream file2(p2); if(!file1.is_open() || !file2.is_open()) return false; std::string line1, line2; while (getline(file1, line1) && getline(file2, line2)) { if (line1 != line2)return false; } int cnta = 0, cntb = 0; while(getline(file1,line1))cnta++; while(getline(file2,line2))cntb++; return cntb - cnta <= 1; }; bool check = compareFiles("output.txt","expected.txt"); if(check) cerr<<"ACCEPTED\n"; else cerr<<"WRONG ANSWER!\n"; } #else #endif
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...