Submission #1158034

#TimeUsernameProblemLanguageResultExecution timeMemory
1158034SmuggingSpunAdvertisement 2 (JOI23_ho_t2)C++20
100 / 100
314 ms41804 KiB
#include<bits/stdc++.h> #define taskname "B" using namespace std; template<class T>void maximize(T& a, T b){ if(a < b){ a = b; } } const int lim = 5e5 + 5; int n, X[lim], E[lim]; namespace sub1{ void solve(){ map<int, bool>cnt; for(int i = 1; i <= n; i++){ cnt[X[i]] = true; } cout << cnt.size(); } } namespace sub23{ void solve(){ map<int, int>repu; for(int i = 1; i <= n; i++){ maximize(repu[X[i]], E[i]); } n = repu.size(); vector<pair<int, int>>vertex; for(pair<const int, int>& it : repu){ vertex.emplace_back(it); } vector<bool>d(n, true); for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ if(i != j && abs(vertex[i].first - vertex[j].first) <= vertex[i].second - vertex[j].second){ d[j] = false; } } } cout << count(d.begin(), d.end(), true); } } //x[i] - x[j] <= e[i] - e[j] -> x[i] - e[i] <= x[j] - e[j] //x[j] - x[i] <= e[i] - e[j] -> x[i] + e[i] >= x[j] + e[j] namespace sub4{ void solve(){ map<int, int>repu; for(int i = 1; i <= n; i++){ maximize(repu[X[i]], E[i]); } n = repu.size(); vector<pair<int, int>>vertex; for(pair<const int, int>& it : repu){ vertex.emplace_back(it); } vector<bool>d(n, true); vector<pair<int, int>>left, right; for(int i = 0; i < n; i++){ right.emplace_back(vertex[i].first + vertex[i].second, i); } sort(right.begin(), right.end(), greater<pair<int, int>>()); for(int i = 0; i < n; i++){ int side = vertex[i].first - vertex[i].second; while(!left.empty()){ auto [S, I] = left.back(); if(S < side){ break; } d[I] = false; left.pop_back(); } left.emplace_back(side, i); side = vertex[i].first + vertex[i].second; while(!right.empty()){ auto [S, I] = right.back(); if(S > side){ break; } right.pop_back(); if(I <= i){ continue; } d[I] = false; } } cout << count(d.begin(), d.end(), true); } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); if(fopen(taskname".inp", "r")){ freopen(taskname".inp", "r", stdin); } cin >> n; for(int i = 1; i <= n; i++){ cin >> X[i] >> E[i]; } if(*min_element(E + 1, E + n + 1) == *max_element(E + 1, E + n + 1)){ sub1::solve(); } else if(n <= 1000){ sub23::solve(); } else{ sub4::solve(); } }

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:91:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   91 |                 freopen(taskname".inp", "r", stdin);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...