답안 #316136

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
316136 2020-10-25T11:50:48 Z georgerapeanu Tenis (COCI20_tenis) C++11
110 / 110
83 ms 4856 KB
#include <bits/stdc++.h>

using namespace std;

const int NMAX = 100005;

int n;
int ran[3][NMAX + 5];
int pos[3][NMAX + 5];

long long ans[3];

int appeared[NMAX + 5];
int fr[1 << 3];
int wh[NMAX + 5];
int wins[NMAX + 5];

int get_best(int a,int b){
    pair<pair<int,int>,int> bst = {{1e9,1e9},1e9};

    for(int h = 0;h < 3;h++){
        pair<pair<int,int>,int> tmp = {{min(pos[h][a],pos[h][b]),max(pos[h][a],pos[h][b])},h};
        bst = min(bst,tmp);
    }
    return bst.second;
}

int get_winner(int a,int b){
    pair<pair<int,int>,int> bst = {{1e9,1e9},1e9};

    for(int h = 0;h < 3;h++){
        pair<pair<int,int>,int> tmp = {{min(pos[h][a],pos[h][b]),max(pos[h][a],pos[h][b])},h};
        bst = min(bst,tmp);
    }
    return ran[bst.second][bst.first.first];
}

int bonus[NMAX + 5];

int main(){
    
    scanf("%d",&n);

    for(int h = 0;h <= 2;h++){
        for(int i = 1;i <= n;i++){
            scanf("%d",&ran[h][i]);
            pos[h][ran[h][i]] = i;
        }
    }

    for(int i = 1;i <= n;i++){
        vector<int> noi;
        for(int h = 0;h <= 2;h++){
            if(wh[ran[h][i]] == 0 || wh[ran[h][i]] == i){
                if(wh[ran[h][i]] == 0){
                    noi.push_back(ran[h][i]);
                    wh[ran[h][i]] = i;
                }
                appeared[ran[h][i]] |= 1 << h;
            }
        }
        for(auto it:noi){
            for(int conf = 1;conf < (1 << 3);conf++){
                pair<int,int> bst = {1e9,1e9};
                for(int h = 0;h < 3;h++){
                    if((conf >> h) & 1){
                        pair<int,int> tmp = {pos[h][it],h};
                        bst = min(bst,tmp);
                    }
                }
                ans[bst.second] += fr[conf];
            }
        }
        for(auto it:noi){
            fr[appeared[it]]++;
        }
        for(int i = 0;i < (int)noi.size();i++){
            for(int j = i + 1;j < (int)noi.size();j++){
                ans[get_best(noi[i],noi[j])]++;
                wins[get_winner(noi[i],noi[j])]++;
            }
        }
        bonus[i - 1] += (int)noi.size();
    }

    for(int i = n;i >= 0;i--){
        bonus[i] += bonus[i + 1];
    }

    for(int i = 1;i <= n;i++){
        wins[i] += bonus[wh[i]];
    }

    for(int i = 0;i < 3;i++)printf("%lld ",ans[i]);printf("\n");
    for(int i = 1;i <= n;i++)printf("%d ",wins[i]);printf("\n");

    return 0;
}

Compilation message

tenis.cpp: In function 'int main()':
tenis.cpp:94:5: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
   94 |     for(int i = 0;i < 3;i++)printf("%lld ",ans[i]);printf("\n");
      |     ^~~
tenis.cpp:94:52: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
   94 |     for(int i = 0;i < 3;i++)printf("%lld ",ans[i]);printf("\n");
      |                                                    ^~~~~~
tenis.cpp:95:5: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
   95 |     for(int i = 1;i <= n;i++)printf("%d ",wins[i]);printf("\n");
      |     ^~~
tenis.cpp:95:52: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
   95 |     for(int i = 1;i <= n;i++)printf("%d ",wins[i]);printf("\n");
      |                                                    ^~~~~~
tenis.cpp:42:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   42 |     scanf("%d",&n);
      |     ~~~~~^~~~~~~~~
tenis.cpp:46:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   46 |             scanf("%d",&ran[h][i]);
      |             ~~~~~^~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 0 ms 384 KB Output is correct
3 Correct 1 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 0 ms 384 KB Output is correct
3 Correct 1 ms 384 KB Output is correct
4 Correct 2 ms 512 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 0 ms 384 KB Output is correct
3 Correct 1 ms 384 KB Output is correct
4 Correct 2 ms 512 KB Output is correct
5 Correct 32 ms 2168 KB Output is correct
6 Correct 47 ms 3064 KB Output is correct
7 Correct 65 ms 3960 KB Output is correct
8 Correct 81 ms 4856 KB Output is correct
9 Correct 81 ms 4856 KB Output is correct
10 Correct 83 ms 4856 KB Output is correct