답안 #801755

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
801755 2023-08-02T07:29:31 Z 반딧불(#10089) IOI 바이러스 (JOI21_fever) C++17
0 / 100
2 ms 520 KB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

int n;
ll x[100002], y[100002];
int ans;

pair<int, ll> meet(int a, int d, int b){
    if(x[a]+y[a] == x[b]+y[b]){
        if(d==0 && x[a] < x[b]) return make_pair(3, x[b]-x[a]);
        if(d==3 && x[a] > x[b]) return make_pair(0, x[a]-x[b]);
        if(d==1 && x[a] < x[b]) return make_pair(2, x[b]-x[a]);
        if(d==2 && x[a] > x[b]) return make_pair(1, x[a]-x[b]);
    }
    if(x[a]-y[a] == x[b]-y[b]){
        if(d==0 && x[a] < x[b]) return make_pair(1, x[b]-x[a]);
        if(d==1 && x[a] > x[b]) return make_pair(0, x[a]-x[b]);
        if(d==2 && x[a] > x[b]) return make_pair(3, x[a]-x[b]);
        if(d==3 && x[a] < x[b]) return make_pair(2, x[b]-x[a]);
    }
    if(x[a] == x[b]){
        if(d==0 && x[a] < x[b]) return make_pair(2, (x[b]-x[a])/2);
        if(d==2 && x[a] > x[b]) return make_pair(0, (x[a]-x[b])/2);
    }
    if(y[a] == y[b]){
        if(d==1 && y[a] > y[b]) return make_pair(3, (y[a]-y[b])/2);
        if(d==3 && y[a] < y[b]) return make_pair(1, (y[b]-y[a])/2);
    }
    return make_pair(-1, -1);
}

bool visited[100002];

struct dat{
    int x, dir; ll d;
    dat(){}
    dat(int x, int dir, ll d): x(x), dir(dir), d(d){}
    bool operator<(const dat &r)const{
        return d>r.d;
    }
};

int main(){
    scanf("%d", &n);
    for(int i=1; i<=n; i++){
        scanf("%lld %lld", &x[i], &y[i]);
        x[i]*=2, y[i]*=2;
    }

    for(int d=0; d<4; d++){
        priority_queue<dat> pq;
        for(int i=1; i<=n; i++) visited[i] = 0;
        pq.push(dat(1, d, 0));

        int cnt = 0;
        while(!pq.empty()){
            dat tmp = pq.top(); pq.pop();
            int x = tmp.x, dir = tmp.dir; ll d = tmp.d;
            if(visited[x]) continue;
            visited[x] = 1;
            cnt++;
            for(int y=1; y<=n; y++){
                if(visited[y]) continue;
                pair<int, ll> p = meet(x, dir, y);
                if(p.first != -1 && p.second < d) continue;
                pq.push(dat(y, p.first, p.second));
            }
        }
        ans = max(ans, cnt);
    }

    printf("%d", ans);
}

Compilation message

fever.cpp: In function 'int main()':
fever.cpp:47:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   47 |     scanf("%d", &n);
      |     ~~~~~^~~~~~~~~~
fever.cpp:49:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   49 |         scanf("%lld %lld", &x[i], &y[i]);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Incorrect 0 ms 212 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Incorrect 0 ms 212 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 520 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Incorrect 0 ms 212 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Incorrect 0 ms 212 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Incorrect 0 ms 212 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Incorrect 0 ms 212 KB Output isn't correct
3 Halted 0 ms 0 KB -