Submission #514505

#TimeUsernameProblemLanguageResultExecution timeMemory
514505RambaXGorillaAdriatic (CEOI13_adriatic)C++17
100 / 100
600 ms107564 KiB
#include<cstdio> #include<cstring> #include<algorithm> #include<utility> using namespace std; typedef long long ll; int N; int islands[250010][2]; int place[2510][2510]; int leastRows[2510]; int mostCols[2510]; int num[2510][2510]; ll dp[2510][2510]; ll dists[250010]; int calcNum(int r, int c){ if(r < 1 || c > 2500){ return 0; } if(num[r][c] + 1){ return num[r][c]; } num[r][c] = calcNum(r, c + 1) + calcNum(r - 1, c) - calcNum(r - 1, c + 1) + place[r][c]; return num[r][c]; } ll calcDists(int r, int c){ if(dp[r][c] + 1){ return dp[r][c]; } if(num[r][c]){ dp[r][c] = calcDists(min(leastRows[c - 1], r), max(mostCols[r + 1], c)) + num[r][c]; } else{ dp[r][c] = 0; } return dp[r][c]; } void solve(){ for(int i = 0;i < 2510;i++){ leastRows[i] = 2510; mostCols[i] = 0; for(int j = 0;j < 2510;j++){ place[i][j] = 0; dp[i][j] = num[i][j] = -1; } } for(int i = 0;i < N;i++){ place[islands[i][0]][islands[i][1]] = 1; leastRows[islands[i][1]] = min(leastRows[islands[i][1]], islands[i][0]); mostCols[islands[i][0]] = max(mostCols[islands[i][0]], islands[i][1]); } for(int i = 2;i < 2510;i++){ leastRows[i] = min(leastRows[i], leastRows[i - 1]); mostCols[2510 - i] = max(mostCols[2510 - i], mostCols[2510 - i + 1]); } calcNum(2500, 1); for(int i = 0;i < N;i++){ if(num[islands[i][0]][islands[i][1]] - 1){ dists[i] += calcDists(islands[i][0], islands[i][1]); } else{ dists[i]++; } } } int main(){ scanf("%d",&N); for(int i = 0;i < N;i++){ scanf("%d%d",&islands[i][0],&islands[i][1]); dists[i] = N - 3; } solve(); for(int i = 0;i < N;i++){ swap(islands[i][0], islands[i][1]); } solve(); for(int i = 0;i < N;i++){ printf("%lld\n",dists[i]); } }

Compilation message (stderr)

adriatic.cpp: In function 'int main()':
adriatic.cpp:66:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   66 |     scanf("%d",&N);
      |     ~~~~~^~~~~~~~~
adriatic.cpp:68:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   68 |         scanf("%d%d",&islands[i][0],&islands[i][1]);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...