Submission #370300

#TimeUsernameProblemLanguageResultExecution timeMemory
370300parsabahramiFortune Telling 2 (JOI14_fortune_telling2)C++17
100 / 100
766 ms80504 KiB
// Call my Name and Save me from The Dark #include <bits/stdc++.h> using namespace std; typedef long long int ll; typedef pair<int, int> pii; #define SZ(x) (int) x.size() #define F first #define S second #define lc id << 1 #define rc lc | 1 const int N = 1e6 + 10; int F[N], seg[N << 2], M[N], A[N], B[N], C[N], n, q; vector<int> cp, vec[2][N]; void modify(int p, int x, int id = 1, int l = 0, int r = SZ(cp)) { if (r - l < 2) { seg[id] = max(seg[id], x); return; } int mid = (l + r) >> 1; if (p < mid) modify(p, x, lc, l, mid); else modify(p, x, rc, mid, r); seg[id] = max(seg[lc], seg[rc]); } int get(int ql, int qr, int id = 1, int l = 0, int r = SZ(cp)) { if (qr <= l || r <= ql) return 0; if (ql <= l && r <= qr) return seg[id]; int mid = (l + r) >> 1; return max(get(ql, qr, lc, l, mid), get(ql, qr, rc, mid, r)); } int id(int x) { return lower_bound(cp.begin(), cp.end(), x) - cp.begin(); } int get(int p) { int ret = 0; for (p++; p; p -= p & -p) ret += F[p]; return ret; } void upd(int p, int x) { for (p++; p < N; p += p & -p) F[p] += x; } int main() { scanf("%d%d", &n, &q); for (int i = 1; i <= n; i++) scanf("%d%d", &A[i], &B[i]), cp.push_back(A[i]), cp.push_back(B[i]); for (int i = 1; i <= q; i++) scanf("%d", &C[i]), cp.push_back(C[i]); sort(cp.begin(), cp.end()); cp.resize(unique(cp.begin(), cp.end()) - cp.begin()); for (int i = 1; i <= q; i++) modify(id(C[i]), i); for (int i = 1; i <= n; i++) { M[i] = get(id(min(A[i], B[i])), id(max(A[i], B[i]))); } for (int i = 1; i <= n; i++) { vec[0][id(max(A[i], B[i]))].push_back(i); } ll tot = 0; for (int i = 1; i <= q; i++) vec[1][id(C[i])].push_back(i); for (int i = SZ(cp) - 1; ~i; i--) { for (int j : vec[1][i]) upd(j, 1); for (int j : vec[0][i]) { int x = get(N - 2) - get(M[j]); if (!M[j]) { tot += (x & 1 ? B[j] : A[j]); } else { if (A[j] > B[j]) swap(A[j], B[j]); tot += (x & 1 ? A[j] : B[j]); } } } printf("%lld\n", tot); return 0; }

Compilation message (stderr)

fortune_telling2.cpp: In function 'int main()':
fortune_telling2.cpp:54:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   54 |     scanf("%d%d", &n, &q);
      |     ~~~~~^~~~~~~~~~~~~~~~
fortune_telling2.cpp:56:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   56 |         scanf("%d%d", &A[i], &B[i]), cp.push_back(A[i]), cp.push_back(B[i]);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~
fortune_telling2.cpp:58:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   58 |         scanf("%d", &C[i]), cp.push_back(C[i]);
      |         ~~~~~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...