内存优解
2025-02-15 23:10:17
发布于:广东
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int MOD = 19940417;
const int MAXN = 1005; // 假设 N 的最大值不超过 1000
struct Segment {
int a, b;
vector<pair<int, int>> points;
};
bool check_adjacent(const vector<pair<int, int>>& points) {
for (int i = 1; i < points.size(); ++i) {
int dx = points[i].first - points[i-1].first;
int dy = points[i].second - points[i-1].second;
if (abs(dy) > dx || (dx - abs(dy)) % 2 != 0) {
return false;
}
}
return true;
}
pair<int, int> process_segment(int a, int b, const vector<pair<int, int>>& points) {
int L = b - a;
vector<long long> fib(L + 3, 0);
fib[0] = 1;
fib[1] = 1;
for (int i = 2; i <= L; ++i) {
fib[i] = (fib[i-1] + fib[i-2]) % MOD;
}
int max_h = (L) / 2;
return {fib[L], max_h};
}
int main() {
int N, K;
cin >> N >> K;
vector<pair<int, int>> points(K);
for (int i = 0; i < K; ++i) {
cin >> points[i].first >> points[i].second;
}
points.emplace_back(0, 0);
points.emplace_back(N, 0);
sort(points.begin(), points.end());
for (auto& p : points) {
    if ((p.first == 0 || p.first == N) && p.second != 0) {
        cout << "0 0" << endl;
        return 0;
    }
}
for (int i = 0; i < points.size(); ++i) {
    if (i > 0 && points[i].first == points[i-1].first) {
        if (points[i].second != points[i-1].second) {
            cout << "0 0" << endl;
            return 0;
        }
    }
}
vector<pair<int, int>> unique_points;
for (int i = 0; i < points.size(); ++i) {
    if (i == 0 || points[i].first != points[i-1].first) {
        unique_points.push_back(points[i]);
    }
}
points = unique_points;
if (!check_adjacent(points)) {
    cout << "0 0" << endl;
    return 0;
}
vector<Segment> segments;
for (int i = 1; i < points.size(); ++i) {
    int a = points[i-1].first;
    int b = points[i].first;
    vector<pair<int, int>> seg_pts;
    for (auto& p : points) {
        if (p.first > a && p.first < b) {
            seg_pts.push_back(p);
        }
    }
    segments.push_back({a, b, seg_pts});
}
long long ans_count = 1;
int ans_max = 0;
for (auto& seg : segments) {
    if (!seg.points.empty()) {
        cout << "0 0" << endl;
        return 0;
    }
    auto res = process_segment(seg.a, seg.b, seg.points);
    ans_count = ans_count * res.first % MOD;
    ans_max = max(ans_max, res.second);
}
cout << ans_count << " " << ans_max << endl;
return 0;
}
这里空空如也


有帮助,赞一个