제출 #1319961

#제출 시각아이디문제언어결과실행 시간메모리
1319961PieArmyCultivation (JOI17_cultivation)C++20
15 / 100
2095 ms956 KiB
#include<bits/stdc++.h> typedef long long ll; #define pb push_back #define fr first #define sc second #define endl '\n' using namespace std; #define mid ((left+right)>>1) const bool boceksizlestir=false; int h,w,n; pair<int,int>arr[323]; vector<int>lens; set<pair<int,int>>st; map<int,vector<int>>mp; map<int,vector<array<int,3>>>cev; int ans=2e9; signed main(){ ios_base::sync_with_stdio(23^23);cin.tie(0); cin>>h>>w>>n; { int a=h,b=w; for(int i=1;i<=n;i++){ cin>>arr[i].fr>>arr[i].sc; a=min(a,arr[i].fr-1); b=min(b,arr[i].sc-1); } for(int i=1;i<=n;i++){ arr[i].fr-=a; arr[i].sc-=b; } } sort(arr+1,arr+n+1,[&](const auto&x,const auto&y){ return x.sc<y.sc; }); lens.pb(w); lens.pb(0); for(int i=1;i<=n;i++){ for(int j=i+1;j<=n;j++){ if(arr[j].sc==arr[i].sc)continue; lens.pb(arr[j].sc-arr[i].sc-1); lens.pb(arr[j].sc-arr[i].sc-1+w); } lens.pb(w-arr[i].sc); } /*for(int i=0;i<=2*w;i++){ lens.pb(i); }*/ sort(lens.begin(),lens.end()); lens.resize(unique(lens.begin(),lens.end())-lens.begin()); for(int k:lens){ mp.clear(); st.clear(); cev.clear(); bool valid=true; for(int i=2;i<=n;i++){ if(arr[i-1].sc+k+1<arr[i].sc)valid=false; } if(arr[n].sc+k<w)valid=false; if(!valid)continue; //cerr<<k<<":"; for(int i=1;i<=n;i++){ mp[arr[i].sc].pb(i); mp[arr[i].sc+k+1].pb(-i); } multiset<int,greater<int>>as,bs,ss; for(auto it=mp.begin();it!=mp.end();it++){ auto[x,v]=*it; for(int y:v){ if(y<0){ y*=-1; st.erase(st.find({arr[y].fr,y})); auto ust=st.upper_bound({arr[y].fr,y}); auto alt=st.lower_bound({arr[y].fr,y}); if(alt!=st.begin()&&ust!=st.end()){ alt--; ss.insert(ust->fr-alt->fr-1); ss.erase(ss.find(ust->fr-arr[y].fr-1)); ss.erase(ss.find(arr[y].fr-alt->fr-1)); } else{ if(alt!=st.begin()){ alt--; ss.erase(ss.find(arr[y].fr-alt->fr-1)); } if(ust!=st.end()){ ss.erase(ss.find(ust->fr-arr[y].fr-1)); } } } else{ auto ust=st.upper_bound({arr[y].fr,y}); auto alt=st.lower_bound({arr[y].fr,y}); if(alt!=st.begin()&&ust!=st.end()){ alt--; ss.erase(ss.find(ust->fr-alt->fr-1)); ss.insert(ust->fr-arr[y].fr-1); ss.insert(arr[y].fr-alt->fr-1); } else{ if(alt!=st.begin()){ alt--; ss.insert(arr[y].fr-alt->fr-1); } if(ust!=st.end()){ ss.insert(ust->fr-arr[y].fr-1); } } st.insert({arr[y].fr,y}); } } if(!st.size())break; /*cerr<<x<<":"; for(auto c:st){ cerr<<c.fr<<" "; } cerr<<endl;*/ int a=st.begin()->fr-1,b=h-(--st.end())->fr,sum=*ss.begin(); cev[x].pb({a,b,sum}); if(next(it)!=mp.end()){ cev[x+w+(next(it)->fr-x)-1].pb({-a-1,-b-1,-sum-1}); //cerr<<x<<":"<<next(it)->fr-1+w<<":"<<a<<" "; } } if(!cev.size())continue; as.clear(); bs.clear(); ss.clear(); for(auto it=cev.begin();it!=cev.end();it++){ auto[r,vec]=*it; if(r>=arr[n].sc+k+1){ //cerr<<(*as.begin())<<"-"<<(*bs.begin())<<"-"<<(*ss.begin())<<" "; ans=min(ans,k+max((*as.begin())+(*bs.begin()),*ss.begin())); break; } //cerr<<r<<'*'; for(auto&x:vec){ if(x[0]<0){ //cerr<<"!"<<-1-x[0]<<"!"; as.erase(as.find(-1-x[0])); bs.erase(bs.find(-1-x[1])); ss.erase(ss.find(-1-x[2])); } else{ as.insert(x[0]); bs.insert(x[1]); ss.insert(x[2]); } } if(next(it)==cev.end()||next(it)->fr>w){ //cerr<<(*as.begin())<<"-"<<(*bs.begin())<<"-"<<(*ss.begin())<<" "; //cerr<<endl; if(boceksizlestir)cerr<<(*as.begin())<<"-"<<(*bs.begin())<<"-"<<(*ss.begin())<<" "; ans=min(ans,k+max((*as.begin())+(*bs.begin()),*ss.begin())); } } if(boceksizlestir)cerr<<k<<":"<<ans<<endl; } cout<<ans<<endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...