博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ4118 : [Wf2015]Window Manager
阅读量:6082 次
发布时间:2019-06-20

本文共 3866 字,大约阅读时间需要 12 分钟。

OPEN、CLOSE、RESIZE操作直接模拟即可。

对于MOVE,设$f_i$表示$i$号矩形的坐标,先无视边界通过DP求出每个矩形的坐标,再根据边界反向用第二次DP求出被移动矩形移动的真实距离,再正着进行一次DP即可。

时间复杂度$O(n^3)$。

 

#include
#include
#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
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]=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].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
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;}

  

转载地址:http://vgzwa.baihongyu.com/

你可能感兴趣的文章
没有显示器的情况下安装和使用树莓派
查看>>
Q85 最大矩形
查看>>
【android】使用handler更新UI
查看>>
mochiweb 源码阅读(十五)
查看>>
前端面试中的常见的算法问题
查看>>
计算机语言的基本理论
查看>>
nodejs流之行读取器例子
查看>>
批量文件重命名工具
查看>>
简单说一下UWP中的JumpList
查看>>
unity将object[]或者string对象转换成枚举enum
查看>>
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 9 章 函数和操作符_9.19. 范围函数和操作符...
查看>>
以太坊系列之六: p2p模块--以太坊源码学习
查看>>
使用scikit-learn解决文本多分类问题(附python演练)
查看>>
2018 年最值得关注的 JavaScript 趋势
查看>>
什么是区块链?超级账本 Brian Behlendorf 从五个方面教你认识
查看>>
Linux中的帮助功能
查看>>
针对Android的Pegasus恶意软件版本和针对iOS的有什么不同?
查看>>
全局探色器
查看>>
Hive Export和Import介绍及操作示例
查看>>
http://mongoexplorer.com/ 一个不错的 mongodb 客户端工具。。。
查看>>