Posters TopCoder - 1684
分析
首先我们不难想到1e4^5的暴力枚举,但显然这是不行的,于是我们考虑对于每一张海报肯定有一种最优情况使得它至少有一条边要么靠着板子的边要么靠着之前的某一张海报的边,这样我们便可以将复杂度优化了很多。我们再考虑将每一种情况进行哈希,这样便可以避免了如图一的情况(矩形中的数字是指这个矩形是第几个被添加进来的)
图一
我们看得出来这两种实际是一种情况,所以通过哈希我们可以避免重复搜索。在有了这些之后我们再在程序中加一些其它剪枝,用容斥统计答案就行了,详见代码。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
#define sp cout<<"---------------------------------------------------"<<endl
#define uli long long
const uli HASH=;
int n,m,k,a[],b[],x[],y[],ans;
set<uli>vis;
uli gethash(int msk){
uli hsh=;
for(int i=;i<k;i++)
if(msk&(<<i)){
hsh=hsh*HASH+(uli)x[i]-(uli)x[];
hsh=hsh*HASH+(uli)y[i]-(uli)y[];
}else {
hsh=hsh*HASH+(uli)n;
hsh=hsh*HASH+(uli)m;
}
return hsh;
}
int getans(int msk){
int i,j,res=;
for(i=msk;i>;i=(i-)&msk){
int x1=-,y1=-,x2=n,y2=m;
for(j=;j<k;j++)
if(i&(<<j)){
x1=max(x1,x[j]),y1=max(y1,y[j]);
x2=min(x2,x[j]+a[j]-);
y2=min(y2,y[j]+b[j]-);
}
if(__builtin_popcount(i)&){
res+=max(x2-x1+,)*max(y2-y1+,);
}else res-=max(x2-x1+,)*max(y2-y1+,);
}
return res;
}
void fx(int);
void work(int msk,int wh,int xx,int yy){
if(yy<||yy+b[wh]>m||xx<||xx+a[wh]>n)return;
x[wh]=xx;y[wh]=yy;
int res=getans(msk|(<<wh));
ans=max(ans,res);
for(int i=;i<k;i++)
if(i!=wh&&!(msk&(<<i)))
res+=a[i]*b[i];
if(res<=ans)return;
uli hsh=gethash(msk|(<<wh));
if(vis.find(hsh)==vis.end()){
vis.insert(hsh);
fx(msk|(<<wh));
}
}
void fy(int msk,int wh,int xx){
int i;
if(xx<||xx+a[wh]>n)return;
work(msk,wh,xx,);
work(msk,wh,xx,m-b[wh]);
for(i=;i<k;i++)
if(msk&(<<i)){
work(msk,wh,xx,y[i]+b[i]);
work(msk,wh,xx,y[i]-b[wh]);
}
}
void fx(int msk){
int i,j;
for(i=;i<k;i++)
if(!(msk&(<<i))){
fy(msk,i,);
fy(msk,i,n-a[i]);
for(j=;j<k;j++)
if(msk&(<<j)){
fy(msk,i,x[j]+a[i]);
fy(msk,i,x[j]-a[i]);
}
}
}
class Posters {
public:
int maxCover(int wt,int ht,vector<int>pw,vector<int>ph){
n=wt,m=ht,k=pw.size();
for(int i=;i<k;i++){
a[i]=min(pw[i],n);
b[i]=min(ph[i],m);
}
fx();
return ans;
}
};
Posters TopCoder - 1684的更多相关文章
- POJ2528Mayor's posters[线段树 离散化]
Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 59683 Accepted: 17296 ...
- TopCoder kawigiEdit插件配置
kawigiEdit插件可以提高 TopCoder编译,提交效率,可以管理保存每次SRM的代码. kawigiEdit下载地址:http://code.google.com/p/kawigiedit/ ...
- POJ 2528 Mayor's posters
Mayor's posters Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Sub ...
- 记第一次TopCoder, 练习SRM 583 div2 250
今天第一次做topcoder,没有比赛,所以找的最新一期的SRM练习,做了第一道题. 题目大意是说 给一个数字字符串,任意交换两位,使数字变为最小,不能有前导0. 看到题目以后,先想到的找规律,发现要 ...
- TopCoder比赛总结表
TopCoder 250 500 ...
- POJ 2528 Mayor's posters(线段树+离散化)
Mayor's posters 转载自:http://blog.csdn.net/winddreams/article/details/38443761 [题目链接]Mayor's posters [ ...
- Topcoder几例C++字符串应用
本文写于9月初,是利用Topcoder准备应聘时的机试环节临时补习的C++的一部分内容.签约之后,没有再进行练习,此文暂告一段落. 换句话说,就是本文太监了,一直做草稿看着别扭,删掉又觉得可惜,索性发 ...
- poj 2528 Mayor's posters(线段树+离散化)
/* poj 2528 Mayor's posters 线段树 + 离散化 离散化的理解: 给你一系列的正整数, 例如 1, 4 , 100, 1000000000, 如果利用线段树求解的话,很明显 ...
- TopCoder
在TopCoder下载好luncher,网址:https://www.topcoder.com/community/competitive%20programming/ 选择launch web ar ...
随机推荐
- Unity3D 自动寻路入门指南
所有用于成为NavMesh的网格都必须被指定为 Navigation Static . 方法如下,选中GameObject,然后在菜单栏的[Window]-[Navigation]-[Object]- ...
- 剑指offer--5.变态跳台阶
WA了一次,错误数据4,输出8,怎么真么熟悉呢?改个return过了,OMG ------------------------------------------------------------- ...
- javascript版前端页面RSA非对称加密解密
最近由于项目需要做一个url传参,并在页面显示参数内容的需求,这样就会遇到一个url地址可能会被假冒, 并传递非法内容显示在页面的尴尬情况 比如xxx.shtml?server=xxx是坏人& ...
- 导入的Android项目出现红色感叹号
[原因] 项目中存在导入包,在项目导入之后,classpath指向的包路径出现错误,即需要重新Bulidpath [解决方式] 右键项目名称 BuildPath —> Configure B ...
- poj 2408 Anagram Groups
Description World-renowned Prof. A. N. Agram's current research deals with large anagram groups. He ...
- 洛谷 P2290 [HNOI2004]树的计数
题目描述 输入输出格式 输入格式: 输入文件第一行是一个正整数n,表示树有n个结点.第二行有n个数,第i个数表示di,即树的第i个结点的度数.其中1<=n<=150,输入数据保证满足条件的 ...
- Azure上Linux VM误配防火墙的恢复方法
在实际运维中,防火墙把自己挡在机器外面的情况会时有发生.如何快速的恢复对运维人员是很重要的. 本文将介绍如何用Azure Extension实现不通过ssh对VM进行操作的方法. 之前写过一遍Blog ...
- 把python2.6升级到python2.7(同样适用于把python2升级到python3)
在启用https过程中,在生成CSR(证书请求文件)时,报错了,说python2.6已被python团队抛弃了,所以升级python到2.7 话不多说,直接上代码: 步骤1:下载python2.7.1 ...
- Python内置函数:strip()
文章转载于:http://www.cnblogs.com/itdyb/p/5046472.html(博主:波比12) 在python API中这样解释strip()函数:
- 【转】 Pro Android学习笔记(八五):了解Package(4):lib项目
目录(?)[-] 什么是lib项目 小例子 Lib的实现 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowing ...