제출 #1162783

#제출 시각아이디문제언어결과실행 시간메모리
1162783mpopov1Poi (IOI09_poi)C++20
100 / 100
381 ms16040 KiB
#include <bits/stdc++.h>
using namespace std;

#define   ll   long long
#define   all(v)   v.begin(), v.end()
#define   rall(v)   v.rbegin(), v.rend()
#define   pb   push_back

int matr[2000][2000];
int main(){
    //freopen("lemonade.in", "r", stdin);
    //freopen("lemonade.out", "w", stdout);
    
    int n,t,p;

    cin >> n >> t >> p;

    for(int i=0; i<n; i++){
        for(int j=0; j<t; j++){
            cin >> matr[i][j];
        }
    }
    int problemcntsolved[2000];
    for(int i=0; i<t; i++){
        int cnt=0;
        for(int j=0; j<n; j++){
            if(matr[j][i]==1) cnt++;
        }
        problemcntsolved[i]=cnt;
    }
    vector<tuple<int, int, int>> v;
    //first=score
    //second=solved problems
    //third=id
    for(int i=0; i<n; i++){
        int sc=0;
        int cnt=0;
        for(int j=0; j<t; j++){
            if(matr[i][j]==1){
                sc+=n-problemcntsolved[j];
                cnt++;
            }
        }
        v.pb(make_tuple(sc, cnt, i));
        
    }
    
    sort(v.rbegin(), v.rend());
    
    int score;
    int rank;
    for(int i=0; i<n; i++){
        if(get<2>(v[i])==p-1){
            score=get<0>(v[i]);
            int cntsled=-1;
            int cntpred=-1;
            int idx=i;
            int idx2=i;
            while(get<0>(v[idx])==get<0>(v[i]) && get<1>(v[idx])==get<1>(v[i])){
                cntsled++;
                idx++;
                if(idx==n) break;
            }
            while(get<0>(v[idx2])==get<0>(v[i]) && get<1>(v[idx2])==get<1>(v[i])){
                cntpred++;
                idx2--;
                if(idx2==-1) break;
            }
            rank=i-cntpred+cntsled+1;
            break;
        }
    }
    //1 solved 0 unsolved

    cout << score << " " << rank;
}

#Verdict Execution timeMemoryGrader output
Fetching results...