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://*.com/questions/22924825/view- ...
随机推荐
-
Spring基于AOP的事务管理
Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...
-
Hadoop学习笔记—10.Shuffle过程那点事儿
一.回顾Reduce阶段三大步骤 在第四篇博文<初识MapReduce>中,我们认识了MapReduce的八大步骤,其中在Reduce阶段总共三个步骤,如下图所示: 其中,Step2.1就 ...
-
nginx新增绑定域名
例如我要使binzz.com也绑定到原有的www.binzz.com上,在server上添加下面代码: server { listen 80; server_n ...
-
android开源项目---developer篇
本文转载于:http://blog.csdn.net/likebamboo/article/details/19081209 主要介绍和Android开发工具和测试工具相关的开源项目. Buck fa ...
-
winform之excel导入和导出
引用命名空间 using Microsoft.Office.Interop.Excel;DataGridView 导出到Excel public static void SaveAs(DataGr ...
-
jquery 验证控件
最近应公司要求做了一个jquery的示例文件,包括:模态窗口怎么实现:jquery validate下的校验:怎么做图片特效:怎么实现异步操作:实现图片上传剪切效果等很多特效: 这里把jquery校验 ...
-
EasyUI 分页 偶遇 问题
当 存在大量 重复 数据字段的 时候 entity.AsNoTracking().ToList().Skip((page.pageNumber - 1) * page.rows).Take(page. ...
-
Linux 驱动——Button驱动7(Timer)消抖
button_drv.c驱动文件: #include <linux/module.h>#include <linux/kernel.h>#include <linux/f ...
-
wireshark抓取OMCI报文
1.安装文件: 1.1 BinDecHex.lua 1.2 omci.lua 2.如上两个文件copy至wireshark安装目录,如C:\Program Files (x86)\Wireshark ...
-
简单几行代码使用百度地图API接口分页获取信息
首发于: 万能助手扩展开发:使用百度地图API接口分页获取信息_电脑计算机编程入门教程自学 http://jianma123.com/viewthread.aardio?threadid=426 使用 ...