#include <bits/stdc++.h>
using namespace std;
#define st first
#define nd second
const int maxn = 300;
struct help{
int mine,minw,mins;
};
help pcomp[maxn][maxn];
int main(){
if(fopen("lighter.inp" , "r")){
freopen("lighter.inp", "r", stdin);
freopen("lighter.out", "w", stdout);
}
cin.tie(0)->sync_with_stdio(0);
cout.tie(0)->sync_with_stdio(0);
int r,c;
cin >> r >> c;
int n;
cin >> n;
vector<pair<int,int>> vpii(n);
for(int i = 0; i < n;i++){
cin >> vpii[i].st >> vpii[i].nd;
vpii[i].st--, vpii[i].nd--;
}
sort(vpii.begin(), vpii.end());
for(int i = 0; i < n; i++){
set<int> si;
multiset<int> diff;
for(int j = i; j < n; j++){
auto [it,trying] = si.insert(vpii[j].nd);
if(!trying){
pcomp[i][j].minw = *si.begin();
pcomp[i][j].mine = c - 1 - *si.rbegin();
if(!diff.empty())
pcomp[i][j].mins = *diff.rbegin();
continue;
}
auto bef = it, aft = it;
aft++;
if(it != si.begin())
bef--;
if(it != si.begin() && aft != si.end()){
diff.erase(diff.find(*aft - *bef - 1));
}
if(it != si.begin()){
diff.insert(*it - *bef - 1);
}
if(aft != si.end()){
diff.insert(*aft - *it - 1);
}
pcomp[i][j].minw = *si.begin();
pcomp[i][j].mine = c - 1 - *si.rbegin();
if(!diff.empty()){
pcomp[i][j].mins = *diff.rbegin();
}
}
}
int minn = INT_MAX, minso = INT_MAX, mins = 0;
for(auto a : vpii)
minn = min(minn,a.st), minso = min(minso, r - a.st - 1);
for(int i = 0; i < vpii.size() - 1; i++){
mins = max(mins, vpii[i + 1].st - vpii[i].st - 1);
}
set<pair<int,int >> extra;
set<int> extran,extras;
extran.insert(0),extras.insert(0);
for(int i = 0; i <n;i++){
extran.emplace(vpii[i].st);
extras.emplace((r - 1) - (vpii[i].st));
}
set<int> gap;
gap.insert(0);
gap.insert(mins);
for(int i = 0; i < n;i++)
for(int j = i + 2; j < n;j++){
gap.emplace((vpii[j].st) - (vpii[i].st));
gap.emplace(max(0,(vpii[j].st) - (vpii[i].st) - 1));
}
for(auto a : extran){
for(auto b : extras){
if(a+b >= mins && a>= minn && b >= minso){
extra.emplace(a,b);
}
}
}
for(auto a : extran){
for(auto b : gap){
if(b>=a && b >= mins && a>=minn && b-a >=minso){
extra.emplace(a,b-a);
}
}
}
for(auto a : extras){
for(auto b : gap){
if(b>=a && b >= mins && b-a>=minn && a >= minso){
extra.emplace(b - a,a);
// cout << "'" << b - a << " " << a << "'" << '\n';
}
}
}
long long minans = LLONG_MAX;
for(auto a : extra){
map<int, vector<int >> mivi;
for(int i = 0; i < n;i++){
int add = vpii[i].st - a.st,minus = vpii[i].st + 1 + a.nd;
add = max(add,0);
mivi[add].push_back(i + 1);
if(minus < r){
mivi[minus].push_back(-(i+1));
}
}
int minw = 0, mine = 0, minsum = 0;
set<int> curin;
for(auto &a : mivi){
for(auto b : a.nd){
if(b>0){
curin.insert(b - 1);
}
else{
curin.erase(-b - 1);
}
}
int sm = *curin.begin(), bg = *curin.rbegin();
assert((bg - sm + 1) == curin.size());
minw = max(minw, pcomp[sm][bg].minw);
mine = max(mine, pcomp[sm][bg].mine);
minsum = max(minsum, pcomp[sm][bg].mins);
// cout << minw << " " << mine << " " << minsum << '\n';
}
minans = min(minans, max((long long)minsum, (long long)mine + minw) + a.st + a.nd);
}
cout << minans << '\n';
}
컴파일 시 표준 에러 (stderr) 메시지
cultivation.cpp: In function 'int main()':
cultivation.cpp:16:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
16 | freopen("lighter.inp", "r", stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
cultivation.cpp:17:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
17 | freopen("lighter.out", "w", stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |