提出 #48085642


ソースコード 拡げる

#include <bits/stdc++.h>
using namespace std;

const int64_t INF = 1E12;

template <class T> int sgn(T x) { return (x > 0) - (x < 0); }
template<class T>
struct Point {
	typedef Point P;
	T x, y;
	explicit Point(T x=0, T y=0) : x(x), y(y) {}
	bool operator<(P p) const { return tie(x,y) < tie(p.x,p.y); }
	bool operator==(P p) const { return tie(x,y)==tie(p.x,p.y); }
	P operator+(P p) const { return P(x+p.x, y+p.y); }
	P operator-(P p) const { return P(x-p.x, y-p.y); }
	P operator*(T d) const { return P(x*d, y*d); }
	P operator/(T d) const { return P(x/d, y/d); }
	T dot(P p) const { return x*p.x + y*p.y; }
	T cross(P p) const { return x*p.y - y*p.x; }
	T cross(P a, P b) const { return (a-*this).cross(b-*this); }
	T dist2() const { return x*x + y*y; }
	double dist() const { return sqrt((double)dist2()); }
	// angle to x-axis in interval [-pi, pi]
	double angle() const { return atan2(y, x); }
	P unit() const { return *this/dist(); } // makes dist()=1
	P perp() const { return P(-y, x); } // rotates +90 degrees
	P normal() const { return perp().unit(); }
	// returns point rotated 'a' radians ccw around the origin
	P rotate(double a) const {
		return P(x*cos(a)-y*sin(a),x*sin(a)+y*cos(a)); }
	friend ostream& operator<<(ostream& os, P p) {
		return os << "(" << p.x << "," << p.y << ")"; }
};

using P = Point<int64_t>;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int n; cin >> n;
    vector<array<int, 3>> pts(n + 1);
    pts[0][1] = 1E9 + 7;
    for (int i = 1; i <= n; i++) {
        cin >> pts[i][0] >> pts[i][1] >> pts[i][2];
    }
    sort(pts.begin(), pts.end());
    vector cost(n + 1, vector<int64_t>(n + 1));
    for (int i = 0; i <= n; i++) {
        for (int j = i + 1; j <= n; j++) {
            if (pts[i][0] == pts[j][0] || pts[i][1] <= pts[j][1]) {
                continue;
            }
            auto [x1, y1, _1] = pts[i];
            auto [x2, y2, _2] = pts[j];
            if (x1 == 0) {
                y1 = y2;
            }
            for (int k = 1; k <= n; k++) {
                auto [x3, y3, w3] = pts[k];
                if (x3 > x1 && x3 <= x2 && P(x1, y1).cross(P(x2, y2), P(x3, y3)) <= 0) {
                    cost[i][j] += w3;
                }
            }
        }
    }
    int64_t ans = 0;
    vector dp(n + 1, vector<int64_t>(n + 1, -INF));
    for (int i = 0; i <= n; i++) {
        for (int j = i + 1; j <= n; j++) {
            if (pts[i][1] == pts[j][1]) {
                continue;
            }
            if (i == 0) {
                dp[i][j] = cost[i][j];
            } else {
                for (int k = 0; k < i; k++) {
                    if (pts[k][0] == pts[i][0] || pts[k][1] <= pts[i][1]) {
                        continue;
                    }
                    if (k != 0 && P(pts[k][0], pts[k][1]).cross(P(pts[i][0], pts[i][1]), P(pts[j][0], pts[j][1])) >= 0) {
                        // cerr << k << " " << i << " " << j << '\n';
                        continue;
                    }
                    dp[i][j] = max(dp[i][j], dp[k][i] + cost[i][j]);
                }
            }
            ans = max(ans, dp[i][j]);
        }
    }
    cout << ans;
}

提出情報

提出日時
問題 I - Convex Dombination
ユーザ kuroni
言語 C++ 20 (gcc 12.2)
得点 100
コード長 3269 Byte
結果 AC
実行時間 10 ms
メモリ 3996 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 100 / 100
結果
AC × 3
AC × 33
セット名 テストケース
Sample 00-sample-001.txt, 00-sample-002.txt, 00-sample-003.txt
All 00-sample-001.txt, 00-sample-002.txt, 00-sample-003.txt, 01-001.txt, 01-002.txt, 01-003.txt, 01-004.txt, 01-005.txt, 01-006.txt, 01-007.txt, 01-008.txt, 01-009.txt, 01-010.txt, 01-011.txt, 01-012.txt, 01-013.txt, 01-014.txt, 01-015.txt, 01-016.txt, 01-017.txt, 01-018.txt, 01-019.txt, 01-020.txt, 01-021.txt, 01-022.txt, 01-023.txt, 01-024.txt, 01-025.txt, 01-026.txt, 01-027.txt, 01-028.txt, 01-029.txt, 01-030.txt
ケース名 結果 実行時間 メモリ
00-sample-001.txt AC 10 ms 3408 KiB
00-sample-002.txt AC 1 ms 3492 KiB
00-sample-003.txt AC 1 ms 3488 KiB
01-001.txt AC 5 ms 3996 KiB
01-002.txt AC 5 ms 3908 KiB
01-003.txt AC 5 ms 3832 KiB
01-004.txt AC 5 ms 3912 KiB
01-005.txt AC 5 ms 3904 KiB
01-006.txt AC 5 ms 3796 KiB
01-007.txt AC 5 ms 3792 KiB
01-008.txt AC 5 ms 3836 KiB
01-009.txt AC 5 ms 3788 KiB
01-010.txt AC 5 ms 3848 KiB
01-011.txt AC 5 ms 3996 KiB
01-012.txt AC 5 ms 3816 KiB
01-013.txt AC 5 ms 3812 KiB
01-014.txt AC 5 ms 3840 KiB
01-015.txt AC 5 ms 3896 KiB
01-016.txt AC 5 ms 3912 KiB
01-017.txt AC 5 ms 3848 KiB
01-018.txt AC 5 ms 3840 KiB
01-019.txt AC 5 ms 3900 KiB
01-020.txt AC 5 ms 3844 KiB
01-021.txt AC 5 ms 3836 KiB
01-022.txt AC 5 ms 3756 KiB
01-023.txt AC 5 ms 3812 KiB
01-024.txt AC 5 ms 3904 KiB
01-025.txt AC 5 ms 3836 KiB
01-026.txt AC 5 ms 3840 KiB
01-027.txt AC 5 ms 3844 KiB
01-028.txt AC 5 ms 3896 KiB
01-029.txt AC 5 ms 3996 KiB
01-030.txt AC 5 ms 3904 KiB