Submission #1317827

#TimeUsernameProblemLanguageResultExecution timeMemory
1317827anteknne섬 항해 (CEOI13_adriatic)C++20
100 / 100
217 ms225240 KiB
#include<bits/stdc++.h> #include<ext/pb_ds/assoc_container.hpp> #include<ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; typedef long long ll; typedef long double ld; #define pb push_back #define pii pair<int, int> #define pll pair<ll, ll> #define st first #define nd second #define ordered_set tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> #define debug true const int MAXN = 250 * 1000 + 17; const int MAXI = 2500; int spref[MAXI + 7][MAXI + 7]; pii a[MAXN]; int miny[MAXI + 7][MAXI + 7]; int minx[MAXI + 7][MAXI + 7]; int maxy[MAXI + 7][MAXI + 7]; int maxx[MAXI + 7][MAXI + 7]; ll dp1[MAXI + 7][MAXI + 7]; ll dp2[MAXI + 7][MAXI + 7]; ll ile (int a1, int b1, int a2, int b2) { return spref[a2][b2] - spref[a1 - 1][b2] - spref[a2][b1 - 1] + spref[a1 - 1][b1 - 1]; } int main () { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n; cin >> n; for (int i = 0; i < n; i ++) { cin >> a[i].st >> a[i].nd; } for (int i = 0; i < n; i ++) { spref[a[i].st][a[i].nd] ++; } for (int i = 0; i <= MAXI; i ++) { for (int j = 0; j <= MAXI; j ++) { minx[i][j] = MAXI + 3; miny[i][j] = MAXI + 3; } } for (int i = MAXI; i >= 1; i --) { for (int j = MAXI; j >= 1; j --) { if (spref[i][j] > 0) { maxx[i][j] = i; maxy[i][j] = j; } maxy[i][j] = max({maxy[i][j], maxy[i + 1][j], maxy[i][j + 1]}); maxx[i][j] = max({maxx[i][j], maxx[i + 1][j], maxx[i][j + 1]}); } } for (int i = 1; i <= MAXI; i ++) { for (int j = 1; j <= MAXI; j ++) { if (spref[i][j] > 0) { minx[i][j] = i; miny[i][j] = j; } minx[i][j] = min({minx[i][j], minx[i - 1][j], minx[i][j - 1]}); miny[i][j] = min({miny[i][j], miny[i - 1][j], miny[i][j - 1]}); spref[i][j] += spref[i - 1][j] + spref[i][j - 1] - spref[i - 1][j - 1]; } } for (int i = 1; i <= MAXI; i ++) { for (int j = MAXI; j >= 1; j --) { //cout << i << " " << j << ": " << ile(1, j, i, MAXI) << "\n"; //cout << minx[i - 1][j - 1] << " " << maxy[i + 1][j + 1] << "\n"; dp1[i][j] = ile(1, j, i, MAXI) + dp1[min(minx[i - 1][j - 1], i)][max(maxy[i + 1][j + 1], j)]; } } /*for (int i = 1; i <= MAXI; i ++) { for (int j = 1; j <= MAXI; j ++) { cout << i << " " << j << ": " << dp1[i][j] << "\n"; } } cout << "\n";*/ for (int i = MAXI; i >= 1; i --) { for (int j = 1; j <= MAXI; j ++) { dp2[i][j] = ile(i, 1, MAXI, j) + dp2[max(maxx[i + 1][j + 1], i)][min(miny[i - 1][j - 1], j)]; } } for (int i = 1; i <= MAXI; i ++) { for (int j = 1; j <= MAXI; j ++) { //cout << i << " " << j << ": " << dp2[i][j] << "\n"; } } for (int i = 0; i < n; i ++) { cout << dp1[a[i].st][a[i].nd] + dp2[a[i].st][a[i].nd] + ll(n - 3) << "\n"; } return 0; }
#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...