CF 안녕하세요 2020 E.New 년과 성 건설

E.New 년과 성 건설

문제의 의미

감안 N 포인트는 각 포인트에 대한 \ (P \) , 4 점의 서브 세트 (서브 세트가 네 점을 갖고, 원 포위 포함 얻었다 P (\ \) ) 개수

경우 동일 선상 주어진 데이터 포인트가 없습니다

니어 TI는 또한 문제의 이해에 자신의 솔루션에 문제가 발견 후 제목 질문의 의미는 잘 이해되지 않는다.

분석

  1. 원에서 네 점의 첫 번째 5 점. 그래서위한 프로그램의 총 수 \ (N-C_ {} * ^. \ 1 4-N-) , 열거의 중간 점, 나머지 (N-1) 번째 포인트 네 점으로부터 선택된 후 나머지.

  2. 고려 (N ^ 2 \) \ 더 큰 집합의 경우를 고려하기 때문에 반대 열거 있도록, 가능한 옵션은 매우 적절하지 않은 모든 시나리오를 열거 앞으로, 방법.

  3. 불법 체계 : 다른 네 점과 점 포함 할 수 없습니다 \ (ρ-을 \) . 열거 된 4 점 점 \ (Q는 \) , 프로그램의 나머지 세 점의 수를 고려하여 계산된다. 고려 \ (P \)(Q를 \) \ 직선으로 연결된 세 개의 점을 취할 수 일측에서 직선은 이러한 조합이 네 점 함유하는 고리 구성 안되도록 발견 할 수 \ (P를 \ ) .

  4. 어떻게 모든 불법 기법을 제거 누설하지 않습니다? \ (P \) \ (Q \) 네 개의 점으로하고 \ (P \) 최소 점 쇄 선의 기울기는,이 기준 만 \ (PQ는 \) 연결된 다른 라인 측 세 점을. 에 이러한 프로그램 기대할 수 없다 (\ p)를 \ 더 반복이없는 우려된다. \ (p \) 가 모든 프로그램을 삭제 보충을 누출 할 수 있도록 열거, 독립적이다.

const int N = 3005;
long double x[N],y[N];
int main()
{
    int n;scanf("%d",&n);
    for(int i=1;i<=n;i++){
        cin >> x[i] >> y[i];
    }    
    ll res = 1ll * n * (n-1) * (n-2) * (n-3) * (n-4) / 24;
    long double pi = acos(-1.0L);
    for(int i=1;i<=n;i++){
        vector<long double> v;
        for(int j=1;j<=n;j++){
            if(i == j)continue;
            v.push_back(atan2(y[j]-y[i],x[j]-x[i]));
        }
        sort(v.begin(),v.end());
        int m = n-1,index = 0;
        for(int j=0;j<m;j++){
            while(index < j + m){
                long double ang = v[index%m] - v[j];
                if(ang < 0) ang += 2 * pi;
                if(ang < pi)index ++;
                else break;
            }
            ll cnt = index - j - 1;
            res -= 1ll * cnt * (cnt - 1) * (cnt - 2) / 6;
        }
    }
    cout << res << endl;
    return 0;
}

참조 링크

주요 역의 B 위로 : https://www.bilibili.com/video/av82161298?p=411

PS : 문제 솔루션은 약간 매우 명확의 기본 비디오까지 장황한하고 나는이 솔루션의 정확성에 대한 몇 가지 추가 생각을했다, 가난한 능력을 표현하고, 독자가 설명으로 부정확 한 내용이나 장소가 이해하지 못하는 찾아내는 경우에, 아래에 댓글을 남겨주세요, 감사합니다! 주요 qscqesze 설명까지 마지막 감사합니다 B 역에서.

추천

출처www.cnblogs.com/1625--H/p/12158932.html