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的更多相关文章

  1. 图解Android - Android GUI 系统 (2) - 窗口管理 (View, Canvas, Window Manager)

    Android 的窗口管理系统 (View, Canvas, WindowManager) 在图解Android - Zygote 和 System Server 启动分析一 文里,我们已经知道And ...

  2. bug_ _java.lang.IllegalArgumentException: View not attached to window manager 2

    今天遇到一个很奇特的问题,当用户设置了PIN码,在锁屏界面正常解锁PIN码后,进入Launcher时显示com.android.phone 已停止运行.一开始猜想会不会是解锁PIN码的时候处理导致了P ...

  3. 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 ...

  4. Android中 View not attached to window manager错误的解决办法

    前几日出现这样一个Bug是一个RuntimeException,详细信息是这样子的:java.lang.IllegalArgumentException: View not attached to w ...

  5. 关于java.lang.IllegalArgumentException: View not attached to window manager 错误的分析

    今天遇到一个很奇特的问题,当用户设置了PIN码,在锁屏界面正常解锁PIN码后,进入Launcher时显示com.android.phone 已停止运行.一开始猜想会不会是解锁PIN码的时候处理导致了P ...

  6. 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 ...

  7. 关于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. ...

  8. View not attached to window manager

    java.lang.IllegalArgumentException: View not attached to window manager 在用ProgressDialog的时候,任务结束后Dis ...

  9. View not attached to window manager crash 的解决办法

    View not attached to window manager crash 的解决办法 转自:http://stackoverflow.com/questions/22924825/view- ...

随机推荐

  1. iOS 获取当前展示的页面

    - (UIViewController *)getCurrentVC { UIViewController *result = nil; UIWindow * window = [[UIApplica ...

  2. Linq学习笔记---Linq to Xml操作

    LINQ to XML的成员, 属性列表: 属性 说明 Document 获取此 XObject 的 XDocument  EmptySequence  获取空的元素集合  FirstAttribut ...

  3. EasyUi – 4.datagrid

    测试的时候用Json来测试就好啦. <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> ...

  4. AXURE在原型设计中的应用

    转: http://uedc.163.com/2248.html 前言 什么是原型呢? 产品原型简单的说就是产品设计成形之前的一个简单框架,对网站来讲,就是将页面模块.元素进行粗放式的排版和布局,深入 ...

  5. 设计模式学习之模板方法模式(TemplateMethod,行为型模式)(9)

    一.什么是模板方法模式 Template Method模式也叫模板方法模式,是行为模式之一,它把具有特定步骤算法中的某些必要的处理委让给抽象方法,通过子类继承对抽象方法的不同实现改变整个算法的行为. ...

  6. 【翻译二十二】java-并发之集合与原子变量

    Concurrent Collections The java.util.concurrent package includes a number of additions to the Java C ...

  7. 基于MyEclipse6.5的ssh整合

    1.编写目的 为了学习,为了更好的学习java. 为了让想要学习这个整合的人少走弯路! ! ! 2.实验环境 l MyEclipse6.5 l JBoss4.2.1 l SQL2005 l 数据库脚本 ...

  8. js 控制展开折叠 div html dom

    js 控制展开折叠 div    html dom <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ...

  9. [Linux] 解压tar.gz文件,解压部分文件

    遇到数据库无法查找问题原因,只能找日志,查找日志的时候发现老的日志都被压缩了,只能尝试解压了   数据量比较大,只能在生产解压了,再进行查找 文件名为*.tar.gz,自己博客以前记录过解压方法: h ...

  10. 外观模式/facade模式/结构型模式

    外观模式 为子系统中的一组接口提供一个一致的界面, Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 外观模式三要素(client-facade-subSystem) 外观角色 ...