Submission #1170655

#TimeUsernameProblemLanguageResultExecution timeMemory
1170655omtheprogrammer1Examination (JOI19_examination)C++20
41 / 100
823 ms44508 KiB
#include <bits/stdc++.h> using namespace std; #define endl "\n" #define ms(arr, v) memset(arr, v, sizeof(arr)) #define mp make_pair #define pb push_back #define fix(prec) {cout << setprecision(prec) << fixed;} #define fastio ios_base::sync_with_stdio(false);cin.tie(NULL); cout.tie(NULL); #define ins insert #define f first #define s second #define all(v) v.begin(), v.end() #define sz(v) (ll)v.size() #define readgraph(list, edges) for (ll i = 0; i < edges; i++) {ll a, b; cin >> a >> b; a--; b--; list[a].pb(b); list[b].pb(a);} typedef long long ll; typedef unsigned long long ull; typedef long double lld; typedef vector<ll> vi; typedef pair<ll, ll> pii; #define F_OR(i, a, b, s) for (ll i=(a); (s)>0?i<(b):i>(b); i+=(s)) #define F_OR1(e) F_OR(i, 0, e, 1) #define F_OR2(i, e) F_OR(i, 0, e, 1) #define F_OR3(i, b, e) F_OR(i, b, e, 1) #define F_OR4(i, b, e, s) F_OR(i, b, e, s) #define GET5(a, b, c, d, e, ...) e #define F_ORC(...) GET5(__VA_ARGS__, F_OR4, F_OR3, F_OR2, F_OR1) #define FOR(...) F_ORC(__VA_ARGS__)(__VA_ARGS__) #define EACH(x, a) for (auto& x: a) ll prexor(ll i) { i++; if ((i % 4) == 0) return 0; else if ((i % 4) == 1) return i - 1; else if ((i % 4) == 2) return 1; else return i; } ll rangexor(ll l, ll r) { if (l == 0) return prexor(r); return prexor(r)^prexor(l - 1); } ll FIRSTTRUE(function<bool(ll)> f, ll lb, ll rb) { while (lb < rb) { ll mb = (lb + rb) / 2; f(mb) ? rb = mb : lb = mb + 1; } return lb; } ll LASTTRUE(function<bool(ll)> f, ll lb, ll rb) { while (lb < rb) { ll mb = (lb + rb + 1) / 2; f(mb) ? lb = mb : rb = mb - 1; } return lb; } template<class A> void read(vector<A>& v); template<class A, size_t S> void read(array<A, S>& a); template<class T> void read(T& x) { cin >> x; } void read(double& d) { string t; read(t); d = stod(t); } void read(long double& d) { string t; read(t); d = stold(t); } template<class H, class... T> void read(H& h, T&... t) { read(h); read(t...); } template<class A> void read(vector<A>& x) { EACH(a, x) read(a); } template<class A, size_t S> void read(array<A, S>& x) { EACH(a, x) read(a); } // #define cerr cout namespace __DEBUG_UTIL__ { /* Primitive Datatypes Print */ void print(const char *x) { cerr << x; } void print(bool x) { cerr << (x ? "T" : "F"); } void print(char x) { cerr << '\'' << x << '\''; } void print(signed short int x) { cerr << x; } void print(unsigned short int x) { cerr << x; } void print(signed int x) { cerr << x; } void print(unsigned int x) { cerr << x; } void print(signed long int x) { cerr << x; } void print(unsigned long int x) { cerr << x; } void print(signed long long int x) { cerr << x; } void print(unsigned long long 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(string x) { cerr << '\"' << x << '\"'; } template <size_t N> void print(bitset<N> x) { cerr << x; } void print(vector<bool> v) { /* Overloaded this because stl optimizes vector<bool> by using _Bit_reference instead of bool to conserve space. */ int f = 0; cerr << '{'; for (auto && i : v) cerr << (f++ ? "," : "") << (i ? "T" : "F"); cerr << "}"; } /* Templates Declarations to support nested datatypes */ template <typename T> void print(T &&x); template <typename T> void print(vector<vector<T>> mat); template <typename T, size_t N, size_t M> void print(T (&mat)[N][M]); template <typename F, typename S> void print(pair<F, S> x); template <typename T, size_t N> struct Tuple; template <typename T> struct Tuple<T, 1>; template <typename... Args> void print(tuple<Args...> t); template <typename... T> void print(priority_queue<T...> pq); template <typename T> void print(stack<T> st); template <typename T> void print(queue<T> q); /* Template Datatypes Definitions */ template <typename T> void print(T &&x) { /* This works for every container that supports range-based loop i.e. vector, set, map, oset, omap, dequeue */ int f = 0; cerr << '{'; for (auto && i : x) cerr << (f++ ? "," : ""), print(i); cerr << "}"; } template <typename T> void print(vector<vector<T>> mat) { int f = 0; cerr << "\n~~~~~\n"; for (auto && i : mat) { cerr << setw(2) << left << f++, print(i), cerr << "\n"; } cerr << "~~~~~\n"; } template <typename T, size_t N, size_t M> void print(T (&mat)[N][M]) { int f = 0; cerr << "\n~~~~~\n"; for (auto && i : mat) { cerr << setw(2) << left << f++, print(i), cerr << "\n"; } cerr << "~~~~~\n"; } template <typename F, typename S> void print(pair<F, S> x) { cerr << '('; print(x.first); cerr << ','; print(x.second); cerr << ')'; } template <typename T, size_t N> struct Tuple { static void printTuple(T t) { Tuple < T, N - 1 >::printTuple(t); cerr << ",", print(get < N - 1 > (t)); } }; template <typename T> struct Tuple<T, 1> { static void printTuple(T t) { print(get<0>(t)); } }; template <typename... Args> void print(tuple<Args...> t) { cerr << "("; Tuple<decltype(t), sizeof...(Args)>::printTuple(t); cerr << ")"; } template <typename... T> void print(priority_queue<T...> pq) { int f = 0; cerr << '{'; while (!pq.empty()) cerr << (f++ ? "," : ""), print(pq.top()), pq.pop(); cerr << "}"; } template <typename T> void print(stack<T> st) { int f = 0; cerr << '{'; while (!st.empty()) cerr << (f++ ? "," : ""), print(st.top()), st.pop(); cerr << "}"; } template <typename T> void print(queue<T> q) { int f = 0; cerr << '{'; while (!q.empty()) cerr << (f++ ? "," : ""), print(q.front()), q.pop(); cerr << "}"; } /* Printer functions */ void printer(const char *) {} /* Base Recursive */ template <typename T, typename... V> void printer(const char *names, T &&head, V &&...tail) { /* Using && to capture both lvalues and rvalues */ int i = 0; for (size_t bracket = 0; names[i] != '\0' and (names[i] != ',' or bracket != 0); i++) if (names[i] == '(' or names[i] == '<' or names[i] == '{') bracket++; else if (names[i] == ')' or names[i] == '>' or names[i] == '}') bracket--; cerr.write(names, i) << " = "; print(head); if (sizeof...(tail)) cerr << " ||", printer(names + i + 1, tail...); else cerr << "]\n"; } /* PrinterArr */ void printerArr(const char *) {} /* Base Recursive */ template <typename T, typename... V> void printerArr(const char *names, T arr[], size_t N, V... tail) { size_t ind = 0; for (; names[ind] and names[ind] != ','; ind++) cerr << names[ind]; for (ind++; names[ind] and names[ind] != ','; ind++) ; cerr << " = {"; for (size_t i = 0; i < N; i++) cerr << (i ? "," : ""), print(arr[i]); cerr << "}"; if (sizeof...(tail)) cerr << " ||", printerArr(names + ind + 1, tail...); else cerr << "]\n"; } } #define debug(...) std::cerr << __LINE__ << ": [", __DEBUG_UTIL__::printer(#__VA_ARGS__, __VA_ARGS__); #define debugArr(...) std::cerr << __LINE__ << ": [", __DEBUG_UTIL__::printerArr(#__VA_ARGS__, __VA_ARGS__); mt19937 mt_rng(chrono::steady_clock::now().time_since_epoch().count()); ll randint(ll a, ll b) { return uniform_int_distribution<ll>(a, b)(mt_rng); } /*--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ const lld pi = 3.14159265358979323846; const ll mod = 1000000007; // const ll mod = 998244353; // ll mod; const ll INF = 1e17; const int d4i[4] = { -1, 0, 1, 0}, d4j[4] = {0, 1, 0, -1}; const int d8i[8] = { -1, -1, 0, 1, 1, 1, 0, -1}, d8j[8] = {0, 1, 1, 1, 0, -1, -1, -1}; const int kni[8] = { +2, +2, -2, -2, 1, -1, 1, -1}, knj[8] = {1, -1, 1, -1, 2, 2, -2, -2}; ll n, m, k, q, l, r, x, y, z , h; const ll tas = 2e5 + 10; ll a[tas]; ll b[tas]; ll c[tas]; string s, t; // vector<int> grid[tas]; // vector<pii> edges[tas]; ll ans[tas]; ll tas1 = 1000000; ll lazy[4000000]; ll st[4000000]; void prop(int in, int l, int r) { int mid = (l + r) / 2; st[2 * in + 1] += lazy[in] * (mid - l + 1); lazy[2 * in + 1] += lazy[in]; st[2 * in + 2] += lazy[in] * (r - mid); lazy[2 * in + 2] += lazy[in]; lazy[in] = 0; } void build(int in, int l, int r) { if (l == r) { st[in] = a[l]; return; } int mid = (l + r) / 2; build(2 * in + 1, l, mid); build(2 * in + 2, mid + 1, r); st[in] = st[2 * in + 1] + st[2 * in + 2]; } void update(int in, int l, int r, int ql, int qr, ll val) { if (qr < l || r < ql) { return; } if (ql <= l && r <= qr) { // lazy update st[in] += (r - l + 1) * val; lazy[in] += val; return; } prop(in, l, r); int mid = (l + r) / 2; update(2 * in + 1, l, mid, ql, qr, val); update(2 * in + 2, mid + 1, r, ql, qr, val); st[in] = st[2 * in + 1] + st[2 * in + 2]; } ll query(int in, int l, int r, int ql, int qr) { if (ql <= l && r <= qr) { return st[in]; } else if (qr < l || r < ql) { return 0; } int mid = (l + r) / 2; prop(in, l, r); ll temp = query(2 * in + 1, l, mid, ql, qr) + query(2 * in + 2, mid + 1, r, ql, qr); return temp; } class clq { public: ll x, l, r, in; void keep(int tx, int tl, int tr, int tin) { x = tx; l = tl; r = tr; in = tin; } }; bool check(clq x, clq y) { return x.x < y.x; } void solve(int tc = 0) { cin >> n >> q; vector<pair<ll, pii>> vec; set<ll> se; se.insert(tas1); se.insert(0); map<ll, int> ma; FOR(n) { cin >> x >> y; a[i] = x, b[i] = y; se.insert(x + y); se.insert(x); se.insert(y); vec.pb(mp(x, mp(x + y, y))); } sort(all(vec)); vector<clq> q1; vector<clq> q2; FOR(q) { cin >> x >> y >> z; clq temp; se.insert(x); se.insert(y); se.insert(z); if ((x + y) >= z) { temp.keep(y, x, tas1, i); q1.pb(temp); } else { l = x, r = tas1; ll l1 = 0, r1 = z - y; se.insert(l1); se.insert(r1); se.insert(r1 + 1); if (!(r1 < l || r < l1)) { // debug(max(l, l1), min(r, r1)) temp.keep(z, max(l, l1), min(r, r1), i); q2.pb(temp); } l1 = z - y + 1, r1 = tas1; se.insert(l1); se.insert(r1); se.insert(r1 + 1); if (!(r1 < l || r < l1)) { // debug("1", max(l, l1), min(r, r1)) temp.keep(y, max(l, l1), min(r, r1), i); q1.pb(temp); } } } ll timer = 0; for (auto val : se) ma[val] = timer++; vector<pair<pair<ll, ll>, ll>> que; int t1 = 0; for (auto val : q1) { que.pb(mp(mp(val.l, 0), t1)); que.pb(mp(mp(val.r + 1, 1), t1++)); } sort(all(que)); // debug(que) int ti = 0; //debug(vec) FOR(n) update(0, 0, tas1, ma[b[i]], ma[b[i]], 1); // debug(query(0, 0, tas1, 6, 17)) FOR(sz(que)) { auto cur = que[i]; while (ti < n && vec[ti].f < cur.f.f) { update(0, 0, tas1, ma[vec[ti].s.s], ma[vec[ti].s.s], -1); ti++; } if (cur.f.s) { ans[q1[cur.s].in] += -query(0, 0, tas1, ma[q1[cur.s].x], ma[tas1]); // debug(ma[q1[cur.s].x], ma[tas1], ans[cur.s], cur.f.f, ti) } else { ans[q1[cur.s].in] += query(0, 0, tas1, ma[q1[cur.s].x], ma[tas1]); } } while (ti < n) { update(0, 0, tas1, ma[vec[ti].s.s], ma[vec[ti].s.s], -1); ti++; } // debug(query(0, 0, tas1, 0, 100000)); que.clear(); debug(ans[3]) int t2 = 0; for (auto val : q2) { que.pb(mp(mp(val.l, 0), t2)); que.pb(mp(mp(val.r + 1, 1), t2++)); } sort(all(que)); ti = 0; FOR(n) update(0, 0, tas1, ma[b[i] + a[i]], ma[b[i] + a[i]], 1); // debug(vec) FOR(sz(que)) { auto cur = que[i]; while (ti < n && vec[ti].f < cur.f.f) { update(0, 0, tas1, ma[vec[ti].s.f], ma[vec[ti].s.f], -1); ti++; } if (cur.f.s) { ans[q2[cur.s].in] += -query(0, 0, tas1, ma[q2[cur.s].x], ma[tas1]); } else { // debug(ma[q2[cur.s].x], ma[tas1], cur.f.f) // debug(ti) ans[q2[cur.s].in] += query(0, 0, tas1, ma[q2[cur.s].x], ma[tas1]); } } FOR(q)cout << ans[i] << endl; } int main() { fastio #ifdef LOCAL auto begin = std::chrono::high_resolution_clock::now(); freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); freopen("error.txt", "w", stderr); #endif ll tc = 1; // cin >> tc; for (int t = 0; t < tc; t++) solve(t); #ifdef LOCAL auto end = std::chrono::high_resolution_clock::now(); auto elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin); // cerr << "Time measured: " << elapsed.count() * 1e-9 << " seconds.\n"; #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...