Submission #897325

#TimeUsernameProblemLanguageResultExecution timeMemory
897325guechotjrhhTreatment Project (JOI20_treatment)C++14
100 / 100
1633 ms138300 KiB
#include <iostream> #include<vector> #include<set> #include<map> #include<fstream> #include<algorithm> using namespace std; #define ll long long #define pi pair<ll,ll> #define x first #define y second #define vi vector<int> #define all(v) v.begin(),v.end() #define l x.x #define r x.y #define t y.x #define p y.y #define maxn (1<<17) #define maxs (1<<18) ll min(ll a, ll b) { return a < b ? a : b; } ll ab(ll n) { return n > 0 ? n : -n; } vector<int> le(maxs), ri(maxs); vector<set<pi>> v(maxs); void bld() { for (int i = maxn; i < maxs; i++) { le[i] = ri[i] = i - maxn; } for (int i = maxn - 1; i > 0; i--) { le[i] = le[i << 1]; ri[i] = ri[(i << 1) + 1]; } } void insert(int i, int j, int ind) { //cout << i << ' ' << j << ' ' << ind << endl; i = 2 * (i + maxn); while (i >>= 1) v[i].insert({j, ind}); } void del(int i, int j, int ind) { i = 2 * (i + maxn); while (i >>= 1) v[i].erase(v[i].find({ j, ind })); } void que(int i, int ex, int ey,vi&res) { if (le[i] > ex) return; if (ri[i] <= ex) { //for (auto it : v[i]) {cout << it.x << ' ' << it.y << " ";}cout << endl; for (auto it : v[i]) { if (it.x > ey) break; res.push_back(it.y); } } else { que(i << 1, ex, ey, res); que((i << 1)+1, ex, ey, res); } } int s, n; long long func(int S, int N, vector<int> T, vector<int> L, vector<int> R, vector<int> P) { s = S; n = N; bld(); //N <= 5000 //vector<pair<pi, pi>> vec(n); //for (int i = 0; i < n; i++) vec[i] = { {L[i],R[i]}, {T[i],P[i]} }; map<int, int> mp; for (int i = 0; i < n; i++) mp[L[i] - T[i]] = 0; int c = 0; for (auto it : mp) mp[it.x] = c++; //vector<ll> dist(n, 1e18); //for (int i = 0; i < n; i++) if (L[i] == 1) dist[i] = P[i]; ll res = 1e18; set<pair<ll, int>> st; for (int i = 0; i < n; i++) { if (L[i] == 1) st.insert({ P[i],i }); else insert(mp[L[i]-T[i]],L[i]+T[i],i); } while (st.size()) { auto it = st.begin(); int i = it->y; ll dst = it->x; st.erase(it); //cout << i << ' ' << dst << endl; if (R[i] == s) res = min(res, dst); auto lt = mp.upper_bound(R[i] - T[i] + 1); if (lt == mp.begin()) continue; lt--; int u = lt->y; //cout << u << endl; vector<int> vec; que(1, u, R[i]+T[i]+1, vec); //cout << "vec: "; for (int j : vec) cout << j << ' '; cout << endl; for (int j : vec) { st.insert({ dst + P[j],j }); del(mp[L[j] - T[j]], L[j] + T[j], j); } /*for (int j = 0; j < n; j++) { if (R[i] - T[i] + 1 >= L[j] - T[j] && R[i] + T[i] + 1 >= L[j] + T[j]) { if (dist[j] > P[j] + dst) { st.erase(st.find({ dist[j],j })); dist[j] = P[j] + dst; st.insert({ dist[j],j }); } } }*/ } //ll res = 1e18; //for (int i = 0; i < n; i++) if (R[i] == s && dist[i] < res) res = dist[i]; return res == 1e18 ? -1 : res; /*map<int, ll> mp; vector<pair<pi, pi>> vec(n); for (int i = 0; i < n; i++) vec[i] = { {L[i],R[i]}, {T[i],P[i]} }; sort(all(vec)); mp[s + 1] = 0; for (int i = n - 1; i >= 0; i--) { auto it = mp.upper_bound(vec[i].r + 1); if (it != mp.begin()) { it--; if (mp.find(vec[i].l) == mp.end()) mp[vec[i].l] = vec[i].p + it->y; else mp[vec[i].l] = min(mp[vec[i].l], vec[i].p + it->y); auto it = mp.find(vec[i].l); while (next(it) != mp.end() && it->y < next(it)->y) mp.erase(next(it)); } } if (mp.find(1) != mp.end()) return mp[1]; return -1;*/ } void run_tests() { string name = "03-00.txt"; for (int i = 1; i <= 18; i++) { cout << "TEST " << i << endl; name[3] = '0' + i / 10; name[4] = '0' + i % 10; ifstream fin("in/" + name); ifstream fout("out/" + name); int S, N; fin >> S >> N; vector<int> T(N), L(N), R(N), P(N); for (int i = 0; i < N; i++) fin >> T[i] >> L[i] >> R[i] >> P[i]; ll u = func(S, N, T, L, R, P),u1; fout >> u1; if (u != u1) { cout << i << endl; cout << S << ' ' << N << endl; cout << u << ' ' << u1 << endl; //for (int i = 0; i < N; i++) cout << T[i] << ' ' << L[i] << ' ' << R[i] << ' ' << P[i] << endl; return; } } } int main() { ios::sync_with_stdio(0); cin.tie(0); //run_tests(); //return 0; int S, N; cin >> S >> N; vector<int> T(N), L(N), R(N), P(N); for (int i = 0; i < N; i++) cin >> T[i] >> L[i] >> R[i] >> P[i]; cout << func(S, N, move(T), move(L), move(R), move(P)) << endl; return 0; } /* 10 5 2 5 10 3 1 1 6 5 5 2 8 3 7 6 10 4 4 1 3 1 7 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...