제출 #170636

#제출 시각아이디문제언어결과실행 시간메모리
170636jacynkaa섬 항해 (CEOI13_adriatic)C++17
100 / 100
404 ms137108 KiB
#include <bits/stdc++.h> #include <math.h> #include <chrono> using namespace std; #pragma GCC optimize("-O3") #define endl "\n" #define mp make_pair #define st first #define nd second #define pii pair<int, int> #define pb push_back #define _upgrade ios_base::sync_with_stdio(0), cout.setf(ios::fixed), cout.precision(10) //cin.tie(0); cout.tie(0); #define REP(i, n) for (int i = 0; i < (n); ++i) #define FWD(i, a, b) for (int i = (a); i < (b); ++i) #define rep(i, n) for (int i = 0; i < (n); ++i) #define fwd(i, a, b) for (int i = (a); i < (b); ++i) #define bck(i, n) for (int i = (n)-1; i >= 0; i--) #define all(c) (c).begin(), (c).end() #define what(x) cerr << #x << " is " << x << endl; #define debug(X) \ cerr << #X << endl; \ rep(i, MAXN) \ { \ rep(j, MAXN) cerr << X[i][j] << " "; \ cerr << endl; \ } const int MAXN = 2500; const int MAXQ = (int)3e5; long long dp[MAXN][MAXN]; int sum[MAXN][MAXN]; bool pole[MAXN][MAXN]; int lef[MAXN][MAXN]; int down[MAXN][MAXN]; long long ans[MAXQ]; pii Q[MAXQ]; int n; pii rotate(pii tmp) { return {MAXN - tmp.st - 1, MAXN - tmp.nd - 1}; } void input() { cin >> n; rep(i, n) { cin >> Q[i].st >> Q[i].nd; Q[i].st--; Q[i].nd--; } } void calcsum() { rep(i, MAXN) rep(j, MAXN) { pole[i][j] = false; sum[i][j] = 0; } rep(i, n) { pole[Q[i].st][Q[i].nd] = true; sum[Q[i].st][Q[i].nd] = 1; } bck(i, MAXN) rep(j, MAXN) if (i != MAXN - 1) sum[i][j] += sum[i + 1][j]; bck(i, MAXN) rep(j, MAXN) if (j != 0) sum[i][j] += sum[i][j - 1]; } void calclef() { rep(i, MAXN) rep(j, MAXN) lef[i][j] = MAXN; rep(i, MAXN) rep(j, MAXN) { if (pole[i][j]) lef[i][j] = min(lef[i][j], j); if (i != 0) lef[i][j] = min(lef[i][j], lef[i - 1][j]); if (j != 0) lef[i][j] = min(lef[i][j], lef[i][j - 1]); } } void calcdown() { rep(i, MAXN) rep(j, MAXN) down[i][j] = 0; bck(i, MAXN) bck(j, MAXN) { if (pole[i][j]) down[i][j] = max(down[i][j], i); if (i != MAXN - 1) down[i][j] = max(down[i][j], down[i + 1][j]); if (j != MAXN - 1) down[i][j] = max(down[i][j], down[i][j + 1]); } } void calcdp() { rep(i, MAXN) bck(j, MAXN) dp[i][j] = 0; bck(i, MAXN) rep(j, MAXN) { int a = (i == MAXN - 1 || j == MAXN - 1) ? i : max(down[i + 1][j + 1], i); int b = (i == 0 || j == 0) ? j : min(lef[i - 1][j - 1], j); dp[i][j] = dp[a][b] + sum[i][j]; // cerr << i << " " << j << " " << a << " " << b << } } void solve() { calcsum(); calcdown(); calclef(); calcdp(); rep(i, n) ans[i] += dp[Q[i].st][Q[i].nd]; } void rotate() { rep(i, n) Q[i] = rotate(Q[i]); } void deb() { return; debug(pole); debug(sum); debug(lef); debug(down); debug(dp); rep(i, n) cerr << Q[i].st << " " << Q[i].nd << endl; cerr << endl; } main() { _upgrade; input(); solve(); deb(); rotate(); solve(); deb(); rep(i, n) cout << ans[i] + n - 3 << endl; }

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

adriatic.cpp:140:6: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
 main()
      ^
#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...