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- ...
随机推荐
- 当ListView有Header时,onItemClick里的position不正确
原文:http://blog.chengbo.net/2012/03/09/onitemclick-return-wrong-position-when-listview-has-headerview ...
- 数据结构和算法 – 10.集合
集合: 联合.交叉.差异.子集 using System; using System.Collections; using System.Collections.Generic; using Syst ...
- Delphi数组
参考:http://www.cnblogs.com/huangjacky/archive/2009/12/21/1628833.html 数组就是一堆相同特性数据的一个组合,也就是每个元素的类型必须是 ...
- MVC:Control与View传值
MVC页面传值的方式主要有三种: 第一种: 采用ViewData.采用键值对的方式,ViewData存储的是一个object类型,传到view层需要强类型转换:使用起来类似于字典集合模式: ViewD ...
- poj 2104:K-th Number(划分树,经典题)
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 35653 Accepted: 11382 Ca ...
- C编译: 动态连接库 (.so文件)(转摘)
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在“纸上谈兵: 算法与数据结构”中,我在每一篇都会有一个C程序,用于实现算法和数据 ...
- hdu 4756 MST+树形dp ****
题意:给你n(n = 1000)个二维点,第一个点是power plant,还有n - 1个点是dormitories.然后现在知道有一条寝室到寝室的边是不能连的,但是我们不知道是哪条边,问这种情况下 ...
- hdu 4049 2011北京赛区网络赛J 状压dp ***
cl少用在for循环里 #include<cstdio> #include<iostream> #include<algorithm> #include<cs ...
- 10gRAC运行srvctl报错error while loading shared libraries:
数据库10g才会有这个错,因为11g的grid和oracle是分开的. [oracle@news01 orcl]$ srvctl /u01/app/oracle/db_1/jdk/jre/bin/ja ...
- 在windows系统的文件右键菜单中增加“命令提示符”
本实用小工具能够在windows系统的文件右键菜单中增加“命令提示符”,方便快速进入制定文件的命令提示窗口,避免逐层输入或复制文件夹路径,极其实用. 工具下载地址如下:360云盘(访问密码:5b71) ...