# |
제출 시각 |
아이디 |
문제 |
언어 |
결과 |
실행 시간 |
메모리 |
1050372 |
2024-08-09T08:58:35 Z |
ksun69(#11101) |
함박 스테이크 (JOI20_hamburg) |
C++17 |
|
701 ms |
83036 KB |
#include <bits/stdc++.h>
using namespace std;
namespace std {
template<class Fun>
class y_combinator_result {
Fun fun_;
public:
template<class T>
explicit y_combinator_result(T &&fun): fun_(std::forward<T>(fun)) {}
template<class ...Args>
decltype(auto) operator()(Args &&...args) {
return fun_(std::ref(*this), std::forward<Args>(args)...);
}
};
template<class Fun>
decltype(auto) y_combinator(Fun &&fun) {
return y_combinator_result<std::decay_t<Fun>>(std::forward<Fun>(fun));
}
} // namespace std
int main(){
ios_base::sync_with_stdio(false), cin.tie(nullptr);
int N, K;
cin >> N >> K;
vector<vector<int> > S(N, vector<int>(4));
for(int i = 0; i < N; i++){
for(int j = 0; j < 4; j++){
cin >> S[i][j];
}
}
vector<int> x_values, y_values;
for(int i = 0; i < N; i++){
x_values.push_back(S[i][0]);
x_values.push_back(S[i][2]);
y_values.push_back(S[i][1]);
y_values.push_back(S[i][3]);
}
sort(x_values.begin(), x_values.end());
sort(y_values.begin(), y_values.end());
x_values.erase(unique(x_values.begin(), x_values.end()), x_values.end());
y_values.erase(unique(y_values.begin(), y_values.end()), y_values.end());
auto get_compress_x = [&](int x){
return int(lower_bound(x_values.begin(), x_values.end(), x) - x_values.begin());
};
auto get_compress_y = [&](int y){
return int(lower_bound(y_values.begin(), y_values.end(), y) - y_values.begin());
};
for(int i = 0; i < N; i++){
S[i][0] = get_compress_x(S[i][0]);
S[i][1] = get_compress_y(S[i][1]);
S[i][2] = get_compress_x(S[i][2]);
S[i][3] = get_compress_y(S[i][3]);
}
// L D R U
vector<pair<int,int> > bad = {{-1, -1}};
auto sol = y_combinator([&](auto self, vector<vector<int>> s, int k) -> vector<pair<int,int> > {
if(s.size() == 0) return vector<pair<int,int> >(k, {0, 0});
if(k == 0) return bad;
vector<int> bounds {int(-1e9), int(-1e9), int(1e9), int(1e9)};
for(int i = 0; i < (int)s.size(); i++){
bounds[0] = max(bounds[0], s[i][0]);
bounds[1] = max(bounds[1], s[i][1]);
bounds[2] = min(bounds[2], s[i][2]);
bounds[3] = min(bounds[3], s[i][3]);
}
for(int x : {bounds[0], bounds[2]}){
for(int y : {bounds[1], bounds[3]}){
vector<vector<int> > nxt;
for(int i = 0; i < (int)s.size(); i++){
if(!(s[i][0] <= x && s[i][2] >= x && s[i][1] <= y && s[i][3] >= y)) nxt.push_back(s[i]);
}
auto res = self(nxt, k-1);
if(res != bad) {
res.push_back({x, y});
return res;
}
}
}
return bad;
})(S, K);
if(sol != bad){
for(int i = 0; i < K; i++){
cout << x_values[sol[i].first] << ' ' << y_values[sol[i].second] << '\n';
}
exit(0);
}
assert(K == 4);
vector<int> bounds {int(-1e9), int(-1e9), int(1e9), int(1e9)};
for(int i = 0; i < N; i++){
bounds[0] = max(bounds[0], S[i][0]);
bounds[1] = max(bounds[1], S[i][1]);
bounds[2] = min(bounds[2], S[i][2]);
bounds[3] = min(bounds[3], S[i][3]);
}
swap(bounds[0], bounds[2]);
swap(bounds[1], bounds[3]);
assert(bounds[0] < bounds[2] && bounds[1] < bounds[3]);
for(int i = 0; i < N; i++){
S[i][0] = max(S[i][0], bounds[0]);
S[i][1] = max(S[i][1], bounds[1]);
S[i][2] = min(S[i][2], bounds[2]);
S[i][3] = min(S[i][3], bounds[3]);
}
vector<vector<vector<int> > > constraints(16);
for(int i = 0; i < N; i++){
int mask = 0;
for(int j = 0; j < 4; j++){
if(S[i][j] == bounds[j]) mask |= (1 << j);
}
constraints[mask].push_back(S[i]);
}
assert(constraints[0].size() == 0);
vector<pair<int,int> > sides(4);
for(int b = 0; b < 4; b++){
assert(!constraints[1 << b].empty());
pair<int,int> lr = {int(-1e9), int(1e9)};
for(auto v : constraints[1 << b]){
lr.first = max(lr.first, v[(b & 1) ^ 1]);
lr.second = min(lr.second, v[(b & 1) ^ 3]);
}
sides[b] = lr;
}
auto remove_contained_rectangles = [&](vector<vector<int> > &rectangles){
sort(rectangles.begin(), rectangles.end(), [&](vector<int> a, vector<int> b){
return pair<int,int>(a[2] - a[0], a[3] - a[1]) < pair<int,int>(b[2] - b[0], b[3] - b[1]);
});
vector<vector<int> > stk;
for(auto v : rectangles){
while(!stk.empty() && stk.back()[0] >= v[0] && stk.back()[1] >= v[1] && stk.back()[2] <= v[2] && stk.back()[3] <= v[3]){
stk.pop_back();
}
stk.push_back(v);
}
rectangles = stk;
};
for(int msk = 0; msk < (1 << 4); msk++){
remove_contained_rectangles(constraints[msk]);
}
vector<pair<int,int> > x_constraints, y_constraints;
for(vector<int> c : constraints[(1 << 1) ^ (1 << 3)]){
x_constraints.push_back({c[0], c[2]});
}
for(vector<int> c : constraints[(1 << 2) ^ (1 << 0)]){
y_constraints.push_back({c[1], c[3]});
}
auto generate_map = [&](vector<pair<int,int> > constraints, int L, pair<int,int> l_bounds, pair<int,int> bounds) -> vector<pair<int,int> > {
vector<vector<pair<int,int> > > ins(L);
vector<vector<pair<int,int> > > rem(L);
multiset<int> lb;
multiset<int> ub;
ub.insert(bounds.second);
lb.insert(bounds.first);
for(auto [l, r] : constraints){
rem[l].push_back({l, r});
ins[r].push_back({l, r});
lb.insert(l);
ub.insert(r);
}
vector<pair<int,int> > res(L);
for(int i = 0; i < L; i++){
for(auto [l, r] : rem[i]){
ub.erase(ub.find(r));
lb.erase(lb.find(l));
}
{
int l = *lb.rbegin();
int r = *ub.begin();
if(l <= r && i >= l_bounds.first && i <= l_bounds.second){
res[i] = {l, r};
} else {
res[i] = {-1, -1};
}
}
for(auto [l, r] : ins[i]){
ub.insert(r);
lb.insert(l);
}
}
return res;
};
int X = x_values.size();
int Y = y_values.size();
vector<pair<int,int> > x_map = generate_map(x_constraints, X, sides[1], sides[3]);
vector<pair<int,int> > y_map = generate_map(y_constraints, Y, sides[0], sides[2]);
vector<pair<int,int> > y_map_flip = generate_map(y_constraints, Y, sides[2], sides[0]);
int max_y_min = -1;
for(int i = 0; i < Y; i++){
if(y_map[i].first != -1){
max_y_min = max(max_y_min, min(i, y_map[i].first));
}
if(y_map_flip[i].first != -1){
max_y_min = max(max_y_min, min(i, y_map_flip[i].first));
}
}
vector<int> y0_x3_max(Y);
int c3 = 0;
for(int y = 0; y < Y; y++){
while(c3 < constraints[(1 << 0) ^ (1 << 3)].size() && constraints[(1 << 0) ^ (1 << 3)][c3][1] <= y){
c3++;
}
y0_x3_max[y] = (c3 == constraints[(1 << 0) ^ (1 << 3)].size() ? bounds[2] : constraints[(1 << 0) ^ (1 << 3)][c3][2]);
}
vector<int> y2_x3_min(Y);
c3 = 0;
for(int y = 0; y < Y; y++){
while(c3 < constraints[(1 << 2) ^ (1 << 3)].size() && constraints[(1 << 2) ^ (1 << 3)][c3][1] <= y){
c3++;
}
y2_x3_min[y] = (c3 == constraints[(1 << 2) ^ (1 << 3)].size() ? bounds[0] : constraints[(1 << 2) ^ (1 << 3)][c3][0]);
}
int c0 = 0;
int c2 = (int)constraints[(1 << 2) ^ (1 << 1)].size();
vector<pair<int,int> > ans;
for(int x = 0; x < X; x++){
while(c0 < constraints[(1 << 0) ^ (1 << 1)].size() && constraints[(1 << 0) ^ (1 << 1)][c0][2] < x){
c0++;
}
int y0max = (c0 == 0 ? bounds[3] : constraints[(1 << 0) ^ (1 << 1)][c0-1][3]);
while(c2 > 0 && constraints[(1 << 2) ^ (1 << 1)][c2-1][0] <= x){
c2--;
}
int y2max = (c2 == 0 ? bounds[3] : constraints[(1 << 2) ^ (1 << 1)][c2-1][3]);
vector<pair<int,int> > y_pairs;
{
int y0 = min(y0max, max_y_min);
int y2 = min(y2max, y_map[y0].second);
if(y_map[y0].first != -1 && y2 >= y0) y_pairs.push_back({y0, y2});
}
{
int y2 = min(y2max, max_y_min);
int y0 = min(y0max, y_map_flip[y2].second);
if(y_map_flip[y2].first != -1 && y0 >= y2) y_pairs.push_back({y0, y2});
}
for(auto [y0, y2] : y_pairs){
int xl = x_map[x].first;
int xr = x_map[x].second;
if(xl == -1) continue;
assert(y0 >= sides[0].first && y0 <= sides[0].second);
xl = max(xl, y2_x3_min[y2]);
xr = min(xr, y0_x3_max[y0]);
if(xl <= xr){
ans = {{x, bounds[1]}, {xl, bounds[3]}, {bounds[0], y0}, {bounds[2], y2}};
}
}
}
if(ans.empty()){
assert(false);
}
for(int m1 = 0; m1 < (1 << 4); m1++){
for(auto cons : constraints[m1]){
bool found = false;
for(auto [x, y] : ans){
if(cons[0] <= x && x <= cons[2] && cons[1] <= y && y <= cons[3]){
found = true;
}
}
if(m1 == 1 && !found) assert(false);
}
}
for(auto [x, y] : ans){
cout << x_values[x] << ' ' << y_values[y] << '\n';
}
}
Compilation message
hamburg.cpp: In function 'int main()':
hamburg.cpp:210:12: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
210 | while(c3 < constraints[(1 << 0) ^ (1 << 3)].size() && constraints[(1 << 0) ^ (1 << 3)][c3][1] <= y){
| ~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
hamburg.cpp:213:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
213 | y0_x3_max[y] = (c3 == constraints[(1 << 0) ^ (1 << 3)].size() ? bounds[2] : constraints[(1 << 0) ^ (1 << 3)][c3][2]);
| ~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
hamburg.cpp:218:12: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
218 | while(c3 < constraints[(1 << 2) ^ (1 << 3)].size() && constraints[(1 << 2) ^ (1 << 3)][c3][1] <= y){
| ~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
hamburg.cpp:221:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
221 | y2_x3_min[y] = (c3 == constraints[(1 << 2) ^ (1 << 3)].size() ? bounds[0] : constraints[(1 << 2) ^ (1 << 3)][c3][0]);
| ~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
hamburg.cpp:228:12: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
228 | while(c0 < constraints[(1 << 0) ^ (1 << 1)].size() && constraints[(1 << 0) ^ (1 << 1)][c0][2] < x){
| ~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
604 KB |
Output is correct |
2 |
Correct |
1 ms |
604 KB |
Output is correct |
3 |
Correct |
2 ms |
604 KB |
Output is correct |
4 |
Correct |
1 ms |
604 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
604 KB |
Output is correct |
2 |
Correct |
3 ms |
856 KB |
Output is correct |
3 |
Correct |
2 ms |
604 KB |
Output is correct |
4 |
Correct |
2 ms |
1112 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
860 KB |
Output is correct |
2 |
Correct |
2 ms |
604 KB |
Output is correct |
3 |
Correct |
2 ms |
860 KB |
Output is correct |
4 |
Correct |
1 ms |
604 KB |
Output is correct |
5 |
Correct |
2 ms |
604 KB |
Output is correct |
6 |
Correct |
2 ms |
860 KB |
Output is correct |
7 |
Correct |
1 ms |
860 KB |
Output is correct |
8 |
Correct |
5 ms |
1188 KB |
Output is correct |
9 |
Correct |
2 ms |
860 KB |
Output is correct |
10 |
Correct |
3 ms |
1116 KB |
Output is correct |
11 |
Correct |
4 ms |
860 KB |
Output is correct |
12 |
Correct |
3 ms |
860 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
604 KB |
Output is correct |
2 |
Correct |
1 ms |
808 KB |
Output is correct |
3 |
Correct |
2 ms |
860 KB |
Output is correct |
4 |
Correct |
2 ms |
604 KB |
Output is correct |
5 |
Correct |
2 ms |
856 KB |
Output is correct |
6 |
Correct |
2 ms |
604 KB |
Output is correct |
7 |
Correct |
2 ms |
860 KB |
Output is correct |
8 |
Correct |
17 ms |
1436 KB |
Output is correct |
9 |
Correct |
3 ms |
860 KB |
Output is correct |
10 |
Correct |
9 ms |
1116 KB |
Output is correct |
11 |
Correct |
14 ms |
1420 KB |
Output is correct |
12 |
Correct |
5 ms |
1164 KB |
Output is correct |
13 |
Correct |
2 ms |
876 KB |
Output is correct |
14 |
Incorrect |
13 ms |
1324 KB |
Output isn't correct |
15 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
604 KB |
Output is correct |
2 |
Correct |
1 ms |
604 KB |
Output is correct |
3 |
Correct |
2 ms |
604 KB |
Output is correct |
4 |
Correct |
1 ms |
604 KB |
Output is correct |
5 |
Correct |
195 ms |
25432 KB |
Output is correct |
6 |
Correct |
202 ms |
25424 KB |
Output is correct |
7 |
Correct |
205 ms |
25260 KB |
Output is correct |
8 |
Correct |
199 ms |
25428 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
604 KB |
Output is correct |
2 |
Correct |
3 ms |
856 KB |
Output is correct |
3 |
Correct |
2 ms |
604 KB |
Output is correct |
4 |
Correct |
2 ms |
1112 KB |
Output is correct |
5 |
Correct |
202 ms |
36708 KB |
Output is correct |
6 |
Correct |
229 ms |
50072 KB |
Output is correct |
7 |
Correct |
215 ms |
34912 KB |
Output is correct |
8 |
Correct |
293 ms |
59556 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
860 KB |
Output is correct |
2 |
Correct |
2 ms |
604 KB |
Output is correct |
3 |
Correct |
2 ms |
860 KB |
Output is correct |
4 |
Correct |
1 ms |
604 KB |
Output is correct |
5 |
Correct |
2 ms |
604 KB |
Output is correct |
6 |
Correct |
2 ms |
860 KB |
Output is correct |
7 |
Correct |
1 ms |
860 KB |
Output is correct |
8 |
Correct |
5 ms |
1188 KB |
Output is correct |
9 |
Correct |
2 ms |
860 KB |
Output is correct |
10 |
Correct |
3 ms |
1116 KB |
Output is correct |
11 |
Correct |
4 ms |
860 KB |
Output is correct |
12 |
Correct |
3 ms |
860 KB |
Output is correct |
13 |
Correct |
214 ms |
42080 KB |
Output is correct |
14 |
Correct |
207 ms |
41632 KB |
Output is correct |
15 |
Correct |
209 ms |
44176 KB |
Output is correct |
16 |
Correct |
210 ms |
35400 KB |
Output is correct |
17 |
Correct |
204 ms |
39512 KB |
Output is correct |
18 |
Correct |
202 ms |
33204 KB |
Output is correct |
19 |
Correct |
215 ms |
42312 KB |
Output is correct |
20 |
Correct |
701 ms |
82372 KB |
Output is correct |
21 |
Correct |
225 ms |
51804 KB |
Output is correct |
22 |
Correct |
344 ms |
83036 KB |
Output is correct |
23 |
Correct |
468 ms |
80988 KB |
Output is correct |
24 |
Correct |
388 ms |
75632 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
604 KB |
Output is correct |
2 |
Correct |
1 ms |
808 KB |
Output is correct |
3 |
Correct |
2 ms |
860 KB |
Output is correct |
4 |
Correct |
2 ms |
604 KB |
Output is correct |
5 |
Correct |
2 ms |
856 KB |
Output is correct |
6 |
Correct |
2 ms |
604 KB |
Output is correct |
7 |
Correct |
2 ms |
860 KB |
Output is correct |
8 |
Correct |
17 ms |
1436 KB |
Output is correct |
9 |
Correct |
3 ms |
860 KB |
Output is correct |
10 |
Correct |
9 ms |
1116 KB |
Output is correct |
11 |
Correct |
14 ms |
1420 KB |
Output is correct |
12 |
Correct |
5 ms |
1164 KB |
Output is correct |
13 |
Correct |
2 ms |
876 KB |
Output is correct |
14 |
Incorrect |
13 ms |
1324 KB |
Output isn't correct |
15 |
Halted |
0 ms |
0 KB |
- |