제출 #1237477

#제출 시각아이디문제언어결과실행 시간메모리
1237477lkaterisOsumnjičeni (COCI21_osumnjiceni)C++20
0 / 110
344 ms22320 KiB
#include <iostream> #include <utility> #include <vector> #include <algorithm> #include <map> #include <climits> using namespace std; int N; pair<int,int> h[200005]; int cnt; int seg[800020]; int lazy[800020]; map<int,int> M; void push(int ind) { if (lazy[ind] != 0) { lazy[ind*2] = max(lazy[ind*2], lazy[ind]); lazy[ind*2+1] = max(lazy[ind*2+1], lazy[ind]); seg[ind*2] = max(seg[ind*2], lazy[ind]); seg[ind*2+1] = max(seg[ind*2+1], lazy[ind]); lazy[ind] = 0; } } void Update(int from, int to, int val, int start=1, int ende=cnt, int ind=1) { if (from == start and ende == to) { seg[ind] = max(seg[ind], val); lazy[ind] = max(lazy[ind], val); return; } push(ind); int mid = (start + ende) / 2; Update(from, to, val, start, mid, ind*2); Update(from, to, val, mid+1, ende, ind*2+1); seg[ind] = max(seg[ind*2], seg[ind*2+1]); } int Query(int from, int to, int start=1, int ende=cnt, int ind=1) { if (from == start and ende == to) return seg[ind]; push(ind); int mid = (start + ende) / 2; int leftMax = Query(from, to, start, mid, ind*2); int rightMax = Query(from, to, mid+1, ende, ind*2+1); if (leftMax > rightMax) return leftMax; else return rightMax; } bool cmp(pair<int,int> a, pair<int,int> b) { if (a.second != b.second) return a.second < b.second; else return a.first < b.first; } int main() { scanf("%d", &N); vector<int> V; for (int i = 1; i <= N; i++) { int l, r; scanf("%d %d", &l, &r); h[i] = make_pair(l, r); V.push_back(l); V.push_back(r); } sort(V.begin(), V.end()); V.erase(unique(V.begin(), V.end()), V.end()); cnt = (int)V.size(); for (int i = 0; i < cnt; i++) { M[V[i]] = i + 1; } for (int i = 1; i <= N; i++) { int l = M[h[i].first]; int r = M[h[i].second]; h[i] = make_pair(l, r); } int s = 1; vector<pair<int,int>> ranges; for (int i = 1; i <= N; i++) { int l = h[i].first; int r = h[i].second; int q = Query(l, r); if (q >= s) { ranges.push_back(make_pair(s, i - 1)); s = q + 1; } Update(l, r, i); } if (s <= N) ranges.push_back(make_pair(s, N)); sort(ranges.begin(), ranges.end()); int Q; scanf("%d", &Q); while (Q--) { int a, b; scanf("%d %d", &a, &b); int l = (lower_bound(ranges.begin(), ranges.end(), make_pair(a, INT_MAX)) - ranges.begin()); if (l > 0) l--; else l = -1; int r = (lower_bound(ranges.begin(), ranges.end(), make_pair(0, b), cmp) - ranges.begin()); int ans = r - l+1; if (ans < 0) ans = 0; printf("%d\n", ans); } return 0; }

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

Main.cpp: In function 'int main()':
Main.cpp:66:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   66 |     scanf("%d", &N);
      |     ~~~~~^~~~~~~~~~
Main.cpp:71:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   71 |         scanf("%d %d", &l, &r);
      |         ~~~~~^~~~~~~~~~~~~~~~~
Main.cpp:110:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  110 |     scanf("%d", &Q);
      |     ~~~~~^~~~~~~~~~
Main.cpp:114:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  114 |         scanf("%d %d", &a, &b);
      |         ~~~~~^~~~~~~~~~~~~~~~~
#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...