제출 #905230

#제출 시각아이디문제언어결과실행 시간메모리
905230alexander707070IOI 바이러스 (JOI21_fever)C++14
37 / 100
3692 ms524288 KiB
#include<bits/stdc++.h>
#define MAXN 500007
using namespace std;

struct point{
    int x,y,pos;
    /// 0-up 1-right 2-down 3-left
};

struct collision{
    int from,to,tim;

    inline friend bool operator < (collision fr,collision sc){
        return fr.tim<sc.tim;
    }
};

int n,cnt,ans;
point p[MAXN];
vector<collision> w;
bool inf[MAXN];

int quadrant(point p){
    if(p.x>=0 and p.y>=0)return 0;
    if(p.x<0 and p.y>=0)return 1;
    if(p.x<0 and p.y<0)return 2;
    return 3;
}

void orientate_points(){
    for(int f=2;f<=n;f++){
        if(quadrant(p[f])==0){
            if(p[f].x>p[f].y)p[f].pos=3;
            if(p[f].x<p[f].y)p[f].pos=2;
            if(p[f].x==p[f].y){
                if(p[1].pos==1 or p[1].pos==2)p[f].pos=2;
                else p[f].pos=3;
            }
        }

        if(quadrant(p[f])==1){
            if(-p[f].x>p[f].y)p[f].pos=1;
            if(-p[f].x<p[f].y)p[f].pos=2;
            if(-p[f].x==p[f].y){
                if(p[1].pos==0 or p[1].pos==1)p[f].pos=1;
                else p[f].pos=2;
            }
        }

        if(quadrant(p[f])==2){
            if(-p[f].x>-p[f].y)p[f].pos=1;
            if(-p[f].x<-p[f].y)p[f].pos=0;
            if(-p[f].x==-p[f].y){
                if(p[1].pos==2 or p[1].pos==1)p[f].pos=1;
                else p[f].pos=0;
            }
        }

        if(quadrant(p[f])==3){
            if(p[f].x>-p[f].y)p[f].pos=3;
            if(p[f].x<-p[f].y)p[f].pos=0;
            if(p[f].x==-p[f].y){
                if(p[1].pos==2 or p[1].pos==3)p[f].pos=3;
                else p[f].pos=0;
            }
        }
    }
}

int collide(point a,point b){
    int s=( abs(a.x-b.x)+abs(a.y-b.y) )/2;
    
    if(a.pos==0)a.y+=s;
    if(a.pos==1)a.x+=s;
    if(a.pos==2)a.y-=s;
    if(a.pos==3)a.x-=s;

    if(b.pos==0)b.y
    +=s;
    if(b.pos==1)b.x+=s;
    if(b.pos==2)b.y-=s;
    if(b.pos==3)b.x-=s;

    if(a.x==b.x and a.y==b.y)return s;
    return -1;
}

int main(){

    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>p[i].x>>p[i].y;
    }
    
    for(int i=2;i<=n;i++){
        p[i].x-=p[1].x;
        p[i].y-=p[1].y;

        p[i].x*=2; p[i].y*=2;
    }
    p[1].x=p[1].y=0;

    for(int i=0;i<4;i++){
        p[1].pos=i;

        orientate_points();
        for(int f=1;f<=n;f++)inf[f]=false;
        inf[1]=true;

        w.clear(); cnt=0;

        for(int f=1;f<=n;f++){
            for(int k=f+1;k<=n;k++){
                w.push_back({f,k,collide(p[f],p[k])});
            }
        }
        sort(w.begin(),w.end());

        for(int f=0;f<w.size();f++){
            if(w[f].tim==-1)continue;
            if(inf[w[f].from])inf[w[f].to]=true;
            if(inf[w[f].to])inf[w[f].from]=true;
        }

        for(int f=1;f<=n;f++){
            if(inf[f])cnt++;
        }

        ans=max(ans,cnt);
    }

    cout<<ans<<"\n";
 
    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

fever.cpp: In function 'int main()':
fever.cpp:123:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<collision>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  123 |         for(int f=0;f<w.size();f++){
      |                     ~^~~~~~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...