BZOJ4118 : [Wf2015]Window Manager
OPEN、CLOSE、RESIZE操作直接模拟即可。
对于MOVE,设$f_i$表示$i$号矩形的坐标,先无视边界通过DP求出每个矩形的坐标,再根据边界反向用第二次DP求出被移动矩形移动的真实距离,再正着进行一次DP即可。
时间复杂度$O(n^3)$。
#include<cstdio>
#include<algorithm>
#define N 260
#define rep(i) for(int i=1;i<=n;i++)
using namespace std;
int xm,ym,n,remain,cnt,x,y,w,h,dx,dy,p,f[N],v[N];char op[9];
struct P{
int x,y,w,h;bool ex;
P(){}
P(int _x,int _y,int _w,int _h){x=_x,y=_y,w=_w,h=_h,ex=1;}
}a[N];
inline bool between(int a,int b,int c){return a<=c&&c<=b;}
inline bool cross(int a,int b,int c,int d){
if(d<a||c>b)return 0;
return 1;
}
inline int getid(int x,int y){
rep(i)if(a[i].ex&&between(a[i].x,a[i].x+a[i].w-1,x)&&between(a[i].y,a[i].y+a[i].h-1,y))return i;
return 0;
}
inline int Open(int x,int y,int w,int h){
if(x+w>xm||y+h>ym)return 0;
rep(i)if(a[i].ex&&cross(a[i].x,a[i].x+a[i].w-1,x,x+w-1)&&cross(a[i].y,a[i].y+a[i].h-1,y,y+h-1))return 0;
a[++n]=P(x,y,w,h);
remain++;
return 1;
}
inline void Close(int p){
a[p].ex=0;
remain--;
}
inline int Resize(int p,int w,int h){
int x=a[p].x,y=a[p].y;
if(x+w>xm||y+h>ym)return 0;
rep(i)if(i!=p&&a[i].ex&&cross(a[i].x,a[i].x+a[i].w-1,x,x+w-1)&&cross(a[i].y,a[i].y+a[i].h-1,y,y+h-1))return 0;
a[p].w=w,a[p].h=h;
return 1;
}
int dfs11(int x){
if(v[x])return f[x];
v[x]=1;
rep(i)if(a[i].ex&&cross(a[i].y,a[i].y+a[i].h-1,a[x].y,a[x].y+a[x].h-1)&&a[i].x<a[x].x)f[x]=max(f[x],dfs11(i)+a[i].w);
return f[x];
}
int dfs12(int x){
if(!v[x])return f[x];
v[x]=0;
f[x]=min(f[x],xm-a[x].w);
rep(i)if(a[i].ex&&cross(a[i].y,a[i].y+a[i].h-1,a[x].y,a[x].y+a[x].h-1)&&a[i].x>a[x].x)f[x]=min(f[x],dfs12(i)-a[x].w);
return f[x];
}
int dfs21(int x){
if(v[x])return f[x];
v[x]=1;
rep(i)if(a[i].ex&&cross(a[i].y,a[i].y+a[i].h-1,a[x].y,a[x].y+a[x].h-1)&&a[i].x>a[x].x)f[x]=min(f[x],dfs21(i)-a[x].w);
return f[x];
}
int dfs22(int x){
if(!v[x])return f[x];
v[x]=0;
f[x]=max(f[x],0);
rep(i)if(a[i].ex&&cross(a[i].y,a[i].y+a[i].h-1,a[x].y,a[x].y+a[x].h-1)&&a[i].x<a[x].x)f[x]=max(f[x],dfs22(i)+a[i].w);
return f[x];
}
int dfs31(int x){
if(v[x])return f[x];
v[x]=1;
rep(i)if(a[i].ex&&cross(a[i].x,a[i].x+a[i].w-1,a[x].x,a[x].x+a[x].w-1)&&a[i].y<a[x].y)f[x]=max(f[x],dfs31(i)+a[i].h);
return f[x];
}
int dfs32(int x){
if(!v[x])return f[x];
v[x]=0;
f[x]=min(f[x],ym-a[x].h);
rep(i)if(a[i].ex&&cross(a[i].x,a[i].x+a[i].w-1,a[x].x,a[x].x+a[x].w-1)&&a[i].y>a[x].y)f[x]=min(f[x],dfs32(i)-a[x].h);
return f[x];
}
int dfs41(int x){
if(v[x])return f[x];
v[x]=1;
rep(i)if(a[i].ex&&cross(a[i].x,a[i].x+a[i].w-1,a[x].x,a[x].x+a[x].w-1)&&a[i].y>a[x].y)f[x]=min(f[x],dfs41(i)-a[x].h);
return f[x];
}
int dfs42(int x){
if(!v[x])return f[x];
v[x]=0;
f[x]=max(f[x],0);
rep(i)if(a[i].ex&&cross(a[i].x,a[i].x+a[i].w-1,a[x].x,a[x].x+a[x].w-1)&&a[i].y<a[x].y)f[x]=max(f[x],dfs42(i)+a[i].h);
return f[x];
}
inline int Move(int p,int dx,int dy){
if(dx+dy==0)return 0;
int x=a[p].x,y=a[p].y,t;
if(dx>0){
rep(i)v[i]=0,f[i]=a[i].x;
f[p]+=dx;
rep(i)if(a[i].ex)dfs11(i);
t=dfs12(p);
rep(i)v[i]=0,f[i]=a[i].x;
f[p]=t;
rep(i)if(a[i].ex)dfs11(i);
rep(i)if(a[i].ex)a[i].x=f[i];
return f[p]-x;
}else if(dx<0){
rep(i)v[i]=0,f[i]=a[i].x;
f[p]+=dx;
rep(i)if(a[i].ex)dfs21(i);
t=dfs22(p);
rep(i)v[i]=0,f[i]=a[i].x;
f[p]=t;
rep(i)if(a[i].ex)dfs21(i);
rep(i)if(a[i].ex)a[i].x=f[i];
return f[p]-x;
}else if(dy>0){
rep(i)v[i]=0,f[i]=a[i].y;
f[p]+=dy;
rep(i)if(a[i].ex)dfs31(i);
t=dfs32(p);
rep(i)v[i]=0,f[i]=a[i].y;
f[p]=t;
rep(i)if(a[i].ex)dfs31(i);
rep(i)if(a[i].ex)a[i].y=f[i];
return f[p]-y;
}else{
rep(i)v[i]=0,f[i]=a[i].y;
f[p]+=dy;
rep(i)if(a[i].ex)dfs41(i);
t=dfs42(p);
rep(i)v[i]=0,f[i]=a[i].y;
f[p]=t;
rep(i)if(a[i].ex)dfs41(i);
rep(i)if(a[i].ex)a[i].y=f[i];
return f[p]-y;
}
return 0;
}
inline int abs(int x){return x>0?x:-x;}
int main(){
scanf("%d%d",&xm,&ym);
while(~scanf("%s%d%d",op,&x,&y)){
cnt++;
if(op[0]=='O'){
scanf("%d%d",&w,&h);
if(!Open(x,y,w,h))printf("Command %d: OPEN - window does not fit\n",cnt);
}
if(op[0]=='C'){
p=getid(x,y);
if(!p)printf("Command %d: CLOSE - no window at given position\n",cnt);
else Close(p);
}
if(op[0]=='R'){
scanf("%d%d",&w,&h);
p=getid(x,y);
if(!p)printf("Command %d: RESIZE - no window at given position\n",cnt);
else if(!Resize(p,w,h))printf("Command %d: RESIZE - window does not fit\n",cnt);
}
if(op[0]=='M'){
scanf("%d%d",&dx,&dy);
p=getid(x,y);
if(!p)printf("Command %d: MOVE - no window at given position\n",cnt);
else{
p=Move(p,dx,dy);
if(abs(p)!=abs(dx+dy))printf("Command %d: MOVE - moved %d instead of %d\n",cnt,abs(p),abs(dx+dy));
}
}
}
printf("%d window(s):\n",remain);
rep(i)if(a[i].ex)printf("%d %d %d %d\n",a[i].x,a[i].y,a[i].w,a[i].h);
return 0;
}
BZOJ4118 : [Wf2015]Window Manager的更多相关文章
- 图解Android - Android GUI 系统 (2) - 窗口管理 (View, Canvas, Window Manager)
Android 的窗口管理系统 (View, Canvas, WindowManager) 在图解Android - Zygote 和 System Server 启动分析一 文里,我们已经知道And ...
- bug_ _java.lang.IllegalArgumentException: View not attached to window manager 2
今天遇到一个很奇特的问题,当用户设置了PIN码,在锁屏界面正常解锁PIN码后,进入Launcher时显示com.android.phone 已停止运行.一开始猜想会不会是解锁PIN码的时候处理导致了P ...
- bug_ _java.lang.IllegalArgumentException: View not attached to window manager
============= 1 view not attached to window manager 转自:http://hi.baidu.com/spare_h/blog/item/7fa3e ...
- Android中 View not attached to window manager错误的解决办法
前几日出现这样一个Bug是一个RuntimeException,详细信息是这样子的:java.lang.IllegalArgumentException: View not attached to w ...
- 关于java.lang.IllegalArgumentException: View not attached to window manager 错误的分析
今天遇到一个很奇特的问题,当用户设置了PIN码,在锁屏界面正常解锁PIN码后,进入Launcher时显示com.android.phone 已停止运行.一开始猜想会不会是解锁PIN码的时候处理导致了P ...
- decorview that was originally added here or java.lang.IllegalArgumentException: View not attached to window manager
使用Dialog的时候,没少出现下面这两个报错 12-11 17:47:49.776: E/WindowManager(11461): android.view.WindowLeaked: Activ ...
- 关于dialog引起的 java.lang.IllegalArgumentException: View=com.android.internal.policy.impl.PhoneWindow$DecorView not attached to window manager 错误的分析
在跑Monkey测试的时候出现了一个比较特别的问题,先来看看Log: // CRASH: com.meizu.media.painter (pid 12491) // Short Msg: java. ...
- View not attached to window manager
java.lang.IllegalArgumentException: View not attached to window manager 在用ProgressDialog的时候,任务结束后Dis ...
- View not attached to window manager crash 的解决办法
View not attached to window manager crash 的解决办法 转自:http://stackoverflow.com/questions/22924825/view- ...
随机推荐
- NYOJ_37.回文字符串 (附滚动数组)
时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba".当然,我们给你的问 ...
- Android缓存学习入门(二)
本文主要包括以下内容 内存缓存策略 文件缓存策略 内存缓存策略 当有一个图片要去从网络下载的时候,我们并不会直接去从网络下载,因为在这个时代,用户的流量是宝贵的,耗流量的应用是不会得到用户的青睐的.那 ...
- Scrapy爬取美女图片 (原创)
有半个月没有更新了,最近确实有点忙.先是华为的比赛,接着实验室又有项目,然后又学习了一些新的知识,所以没有更新文章.为了表达我的歉意,我给大家来一波福利... 今天咱们说的是爬虫框架.之前我使用pyt ...
- ASP.NET的Cookie和Session
HTTP属于应用层,HTTP协议一共有五大特点:1.支持客户/服务器模式;2.简单快速;3.灵活;4.无连接;5.无状态. 无状态HTTP协议是无状态的协议.一旦数据交换完毕,客户端与服务器端的连接就 ...
- Ubuntu下调整swap分区的大小
转自:http://blog.chinaunix.net/uid-7573623-id-2048964.html 由于安装oracle 的时候,swap太小不能继续安装,于是想有什么方法在不不用安装o ...
- CentOS-6.5安装配置Tengine
一.安装pcre: cd /usr/local/src wget http://downloads.sourceforge.net/project/pcre/pcre/8.34/pcre-8.34.t ...
- PHP json数据格式化方法
php 的json_encode能把数组转换为json格式的字符串.字符串没有缩进,中文会转为unicode编码,例如\u975a\u4ed4.人阅读比较困难.现在这个方法在json_encode的基 ...
- EF Core 1.0中使用Include的小技巧
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:由于EF Core暂时不支持Lazy Loading,所以利用Include来加载额外 ...
- Spring容器初始化过程
一.Spring 容器高层视图 Spring 启动时读取应用程序提供的Bean配置信息,并在Spring容器中生成一份相应的Bean配置注册表,然后根据这张注册表实例化Bean,装配号Bean之间的依 ...
- 在Salesforce中实现对Object的增删改查操作
1): Insert Statement http://www.salesforce.com/us/developer/docs/apexcode/index_Left.htm#CSHID=ap ...