从大到小依次考虑这些正方形。如果一个正方形是合法的,那么原矩形就会被划分成两个新的矩形,如下:
蓝色是当前的正方形,橙色和红色就是两个新的矩形。我们把这些新的矩形丢到 multiset 里维护,按照 \(\min(\text{长,宽})\) 从小到大排序,也就是每拿到一个新的正方形就从小的矩形开始考虑,而正方形又是从大到小排序的,这样不会有浪费。
struct node{
int h,w,t;
bool operator <(const node &x)const{
return t<x.t;
}
};
multiset<node>st;
int main()
{
h=read(),w=read(),n=read();
FOR(i,1,n) a[i]=read(),a[i]=pow(2,a[i]);
sort(a+1,a+1+n);reverse(a+1,a+1+n);
st.insert({h,w,min(h,w)});
FOR(i,1,n){
auto it=st.begin();
for(;it!=st.end();++it){
if((*it).t>=a[i]) break;
}
if(it==st.end()) return puts("No"),0;
node x=*it;
st.erase(it);
if(min(x.h-a[i],a[i]))
st.insert({x.h-a[i],a[i],min(x.h-a[i],a[i])});
if(min(x.h,x.w-a[i]))
st.insert({x.h,x.w-a[i],min(x.h,x.w-a[i])});
}
puts("Yes");
return 0;
}
标签:insert,矩形,min,read,ARC172A,st,正方形,Chocolate
From: https://www.cnblogs.com/LHLeisus/p/18022371