This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |