Submission #714928

#TimeUsernameProblemLanguageResultExecution timeMemory
714928MISM06Fortune Telling 2 (JOI14_fortune_telling2)C++14
100 / 100
335 ms23652 KiB
//0 1 1 0 1 //0 1 0 0 1 //1 0 0 1 1 //0 1 1 0 1 //uoy kcuf; #include <bits/stdc++.h> #pragma GCC optimize("Ofast,unroll-loops") // #pragma GCC target("avx2") using namespace std; #define F first #define S second #define pb push_back #define sze size() #define all(x) x.begin() , x.end() #define wall__ cout << "--------------------------------------\n"; #define node int mid = (tl + tr) >> 1, cl = v << 1, cr = v << 1 | 1 #define file_io freopen("input.cpp", "r", stdin); freopen("output.cpp", "w", stdout); typedef long long ll; typedef long double dl; typedef pair < int , int > pii; typedef pair < int , ll > pil; typedef pair < ll , int > pli; typedef pair < ll , ll > pll; typedef pair < int , pii > piii; typedef pair < ll, pll > plll; const ll N = 2e5 + 10; const ll mod = 1e9 + 7; const ll inf = 2e16; const ll rinf = -2e16; const ll INF = 1e9 + 10; const ll rINF = -1e9 - 10; const ll lg = 32; int n, k, a[N], b[N], c[N]; pii par[N]; vector < pii > kid[N]; vector < pii > ord; int mx[N << 2]; void build (int v, int tl, int tr) { if (tl == tr) { mx[v] = ord[tl].S; return; } node; build(cl, tl, mid); build(cr, mid + 1, tr); mx[v] = max(mx[cl], mx[cr]); } int find_mx (int l, int r, int v, int tl, int tr) { if (l > r) return 0; if (l == tl && r == tr) return mx[v]; node; return max(find_mx(l, min(r, mid), cl, tl, mid), find_mx(max(l, mid + 1), r, cr, mid + 1, tr)); } int sit[N], la[N << 2]; void shift (int v, int tl, int tr) { if (la[v] == 0) return; if (tl != tr) { la[v << 1] ^= 1; la[v << 1 | 1] ^= 1; } else sit[tl] ^= 1; la[v] = 0; } void upd (int l, int r, int v, int tl, int tr) { shift(v, tl, tr); if (l > r) return; if (l == tl && r == tr) { la[v] ^= 1; shift(v, tl, tr); return; } node; upd (l, min(r, mid), cl, tl, mid); upd (max(l, mid + 1), r ,cr, mid + 1, tr); } int pos; int ask (int v, int tl, int tr) { shift(v, tl, tr); if (tl == tr) return sit[tl]; node; if (pos <= mid) return ask(cl, tl, mid); else return ask(cr, mid + 1, tr); } void solve () { cin >> n >> k; vector < piii > g; g.pb({-1, {-1, -1}}); for (int i = 1; i <= n; i++) { cin >> a[i] >> b[i]; g.pb({max(a[i] , b[i]), {a[i], b[i]}}); } sort(all(g)); // for (auto e : g) cout << e.F << "," << e.S.F <<"," << e.S.S << " | "; // cout << '\n'; wall__ for (int i = 1; i <= n; i++) { a[i] = g[i].S.F; b[i] = g[i].S.S; } // for (int i = 1; i <= n; i++) cout << a[i] << " , " << b[i] << " | "; // cout << '\n'; wall__ for (int i = 1; i <= k; i++) { cin >> c[i]; ord.pb({c[i], i}); } ord.pb({-1, -1}); sort(all(ord)); // for (int i = 1; i <= k; i++) cout << ord[i].F << "," << ord[i].S << " | "; // cout << '\n'; wall__ build(1, 1, k); // cout << "start of find kids : \n"; for (int i = 1; i <= n; i++) { // cout << i << " : \n"; if (a[i] == b[i]) { // cout << "do nothing\n"; wall__ continue; } int x = a[i], y = b[i]; if (x > y) swap(x, y); // cout << a[i] << " , " << b[i] << " -- > " << x << " , " << y << '\n'; int t = 0; if (a[i] < b[i]) t = 1; // cout << "t = " << t << '\n'; pii X = {x, 0}, Y = {y, 0}; int l = -1, r = k + 1; if (ord[k].F >= x) l = lower_bound(all(ord), X) - ord.begin(); if (ord[k].F >= y) r = lower_bound(all(ord), Y) - ord.begin(); --r; // cout << l << " , " << r << '\n'; if (l == -1 || r == 0 || l > r) { // cout << "do nothing\n"; wall__ continue; } int p = find_mx(l, r, 1, 1, k); // cout << "p = " << p << '\n'; par[i] = {p, t}; kid[p].pb({i, t}); // wall__ } // cout << "end of find kids\n"; // wall__ // cout << "kids : \n"; // for (int i = 1; i <= k; i++) { // cout << i << " : "; // for (auto e : kid[i]) cout << e.F << "," << e.S << " | "; // cout << '\n'; // } // wall__ // cout << "start of FUCK!\n"; // wall__ for (int i = 1; i <= k; i++) { // cout << i << " , " << c[i] << " : \n"; piii CC = {c[i] + 1, {0, 0}}; auto it = lower_bound(all(g), CC); int id; if (it == g.end()) id = n; else { id = it - g.begin(); --id; } // cout << "id = " << id << '\n'; if (id > 0) upd(1, id, 1, 1, n); for (auto hah : kid[i]) { int v = hah.F, t= hah.S; // cout << v << "-" << t << " ; "; pos = v; int p = ask(1, 1, n); // cout << p << '\n'; if (t != p) upd(v, v, 1, 1, n); } // wall__ } // cout << "End of Fuck :(\n"; // wall__ ll ans = 0; for (int i = 1; i <= n; i++) { pos = i; int p = ask(1, 1, n); // cout << p; if (p == 1) ans += (1ll * b[i]); else ans += (1ll * a[i]); } // cout << '\n'; // wall__ cout << ans << '\n'; } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t = 1; // cin >> t; while (t--) {solve();} return 0; } /* */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...