제출 #514505

#제출 시각아이디문제언어결과실행 시간메모리
514505RambaXGorilla섬 항해 (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]);
    }
}

컴파일 시 표준 에러 (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...