[ARC172A] Chocolate

AtCoder

洛谷

从大到小依次考虑这些正方形。如果一个正方形是合法的,那么原矩形就会被划分成两个新的矩形,如下:

蓝色是当前的正方形,橙色和红色就是两个新的矩形。我们把这些新的矩形丢到 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;
}

posted @ 2024-02-20 09:12  LHLeisus  阅读(81)  评论(0)    收藏  举报