제출 #1208116

#제출 시각아이디문제언어결과실행 시간메모리
1208116CodeLakVNOsumnjičeni (COCI21_osumnjiceni)C++20
0 / 110
124 ms8396 KiB
#include <bits/stdc++.h> using namespace std; #define task "main" #define no "NO" #define yes "YES" #define F first #define S second #define vec vector #define _mp make_pair #define ii pair<int, int> #define sz(x) (int)x.size() #define all(x) x.begin(), x.end() #define evoid(val) return void(std::cout << val) #define FOR(i, a, b) for(int i = (a); i <= (b); ++i) #define FOD(i, b, a) for(int i = (b); i >= (a); --i) const int MAX_N = (int)2e5 + 5; const int S = 450; int n, q; ii seg[MAX_N]; ii query[MAX_N]; struct BIT { int bit[MAX_N]; void update(int idx, int val) { for (; idx <= n; idx += (idx & -idx)) bit[idx] += val; } void update(int l, int r, int val) { update(l, val); update(r + 1, -val); } int get(int idx) { int res = 0; for (; idx > 0; idx -= (idx & -idx)) res += bit[idx]; return res; } int get(int l, int r) { return get(r) - get(l - 1); } }; struct BIT_LAZY { BIT bitAdd, bitSub; void update(int l, int r, int val) { bitAdd.update(l, r, val); bitSub.update(l, r, (l - 1) * val); bitSub.update(r + 1, (-r + l - 1) * val); } int get(int idx) { return idx * bitAdd.get(idx) - bitSub.get(idx); } int get(int l, int r) { return get(r) - get(l - 1); } } bit; int maxR[MAX_N]; vector<int> com; int ID(int x) { return lower_bound(com.begin(), com.end(), x) - com.begin() + 1; } void compress() { FOR(i, 1, n) com.push_back(seg[i].F), com.push_back(seg[i].S); sort(com.begin(), com.end()); com.erase(unique(com.begin(), com.end()), com.end()); FOR(i, 1, n) seg[i].F = ID(seg[i].F), seg[i].S = ID(seg[i].S); } void init() { compress(); int l = 1; FOR(r, 1, n) { while (bit.get(seg[r].F, seg[r].S) != 0) { bit.update(seg[l].F, seg[l].S, -1); maxR[l] = r - 1; l++; } bit.update(seg[r].F, seg[r].S, 1); } for (; l <= n; l++) maxR[l] = n; } int block[MAX_N]; int cnt[MAX_N], nxt[MAX_N]; void build() { FOR(i, 1, n) block[i] = (i - 1) / S; FOD(i, n, 1) { int maxRI = maxR[i] + (maxR[i] < n ? 1 : 0); if (block[i] == block[n]) { nxt[i] = n + 1; if (i != n) cnt[i] = cnt[maxRI] + 1; continue; } if (block[maxRI] != block[i]) { nxt[i] = maxRI; cnt[i] = 1; } else { nxt[i] = nxt[maxRI]; cnt[i] = cnt[maxRI] + 1; } } } int get(int l, int r) { int ans = 0; while (nxt[l] <= r) { ans += cnt[l]; l = nxt[l]; } while (l <= r) { ans++; l = maxR[l] + 1; } return ans; } void solve() { cin >> n; FOR(i, 1, n) cin >> seg[i].F >> seg[i].S; init(); build(); cin >> q; while (q--) { int l, r; cin >> l >> r; cout << get(l, r) << "\n"; } } int32_t main() { if (fopen(task".inp", "r")) { freopen(task".inp", "r", stdin); freopen(task".out", "w", stdout); } ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); bool multitest = 0; int numTest = 1; if (multitest) cin >> numTest; while (numTest--) { solve(); } return 0; } /* Lak lu theo dieu nhac!!!! */

컴파일 시 표준 에러 (stderr) 메시지

Main.cpp: In function 'int32_t main()':
Main.cpp:148:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  148 |         freopen(task".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:149:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  149 |         freopen(task".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#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...