社区讨论

数据疑似过水

P2924 [USACO08DEC] Largest Fence G参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@m35qsxqk
此快照首次捕获于
2024/11/06 18:35
去年
此快照最后确认于
2025/11/04 15:13
4 个月前
查看原帖
在求极角时没有判象限都过了,代码如下:
CPP
// P2924
#include <bits/stdc++.h>
using namespace std;
#define Point seg
const int INF = 0x3f3f3f3f;

struct seg{
    int x, y;
    int from, to;

    Point operator-(Point a){
        return {x-a.x, y-a.y, 0};
    }

    bool operator<(Point a){
        if (x == a.x)
            return y < a.y;
        return x < a.x;
    }
};

seg st = {0, 0, 0, 0};

int det(Point a, Point b){
    return (a.x*b.y-a.y*b.x);
}

int sgn(int x){
    if (abs(x) <= 1e-8)
        return 0;
    return ((x>0)?(1):(-1));
}

int len(Point a){
    return a.x*a.x+a.y*a.y;
}

bool pmc(Point a,Point b){//叉积按照极角由小到大排序
    if(sgn(det(a-st,b-st))==0)return len(a)<len(b);
    return sgn(det(a-st,b-st))>0;
}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n;
    cin >> n;
    pair<int, int> p[n+1];
    for (int i=1; i<=n; i++){
        cin >> p[i].first >> p[i].second;
    }
    vector<seg> s;
    seg now;
    for (int i=1; i<=n; i++){
        for (int j=1; j<=n; j++){
            if (i == j)
                continue;
            now.from = i;
            now.to = j;
            now.x = p[j].first-p[i].first;
            now.y = p[j].second-p[i].second;
            s.push_back(now);
        }
    }
    sort(s.begin(), s.end(), pmc);
    // reverse(s.begin(), s.end());
    int m = s.size();
    int dp[n+1];
    int f[n+1];
    int ans = 0;
    for (int i=1; i<=n; i++){
        memset(dp, 0xf0, sizeof(dp));
        memset(f, 0, sizeof(f));
        f[i] = 1;
        dp[i] = 0;
        for (auto j: s){
            if (f[j.from]){
                dp[j.to] = max(dp[j.to], dp[j.from]+1);
                f[j.to] = 1;
            }
            // dp[j.to] = max(dp[j.to], dp[j.from]+1);
        }
        ans = max(ans, dp[i]);
    }
    cout << ans;
    return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...