BZOJ1114 : [POI2008]鲁滨逊逃生Rob

设船最宽行列的交点为船的重心,那么只要预处理出重心在每个位置是否可行,以及在边界上走出边界所需的最小值之后,进行一遍BFS即可。

枚举每个点$(x,y)$,求出它上下最近的障碍物的距离。考虑重心在第$x$行左右移动的时候,不能走的部分是一个区间,可以$O(1)$计算。

对于左右障碍物也同理,因此可以通过维护差分前缀和可以做到$O(n^2)$预处理出所有可行位置。

对于边界,首先一定可以通过一直往一个方向走得到一个解;其次对于四个角落上的点,可以通过$O(n)$枚举它卡住船的哪个角落来得到走出地图的最优解。

总时间复杂度为$O(n^2)$。

#include<cstdio>
const int N=2010,inf=100000000;
int n,i,j,x,y,z,xl=inf,xr,yl=inf,yr,xm,ym,d,mu,md,l,r;
int f[N][N],h,t,q[N*N][2],ans=inf;
int ul[N],ur[N],dl[N],dr[N],fu[N],fd[N],f11,f1n,fn1,fnn;
char a[N][N],ban[N][N];
inline void umin(int&a,int b){if(a>b)a=b;}
inline void umax(int&a,int b){if(a<b)a=b;}
inline void add(int x,int y,int z){
  if(x<1||x>n||y<1||y>n)return;
  if(ban[x][y]||~f[x][y])return;
  if(x==1)umin(ans,z+xr-xm+1);
  if(x==n)umin(ans,z+xm-xl+1);
  if(y==1)umin(ans,z+yr-ym+1);
  if(y==n)umin(ans,z+ym-yl+1);
  if(x==1&&y==1)umin(ans,z+f11);
  if(x==1&&y==n)umin(ans,z+f1n);
  if(x==n&&y==1)umin(ans,z+fn1);
  if(x==n&&y==n)umin(ans,z+fnn);
  q[++t][0]=x,q[t][1]=y,f[x][y]=z;
}
int main(){
  scanf("%d",&n);
  for(i=1;i<=n;i++)for(scanf("%s",a[i]+1),j=1;j<=n;j++)if(a[i][j]==‘r‘){
    umin(xl,i);
    umax(xr,i);
    umin(yl,j);
    umax(yr,j);
  }
  for(i=xl;i<=xr;i++){
    for(j=yl;j<=yr;j++)if(a[i][j]!=‘r‘)break;
    if(j>yr)xm=i;
  }
  for(i=yl;i<=yr;i++){
    for(j=xl;j<=xr;j++)if(a[j][i]!=‘r‘)break;
    if(j>xr)ym=i;
  }
  for(i=xl;i<=xm;i++){
    d=xm-i;
    ul[d]=inf;ur[d]=0;
    for(j=yl;j<=yr;j++)if(a[i][j]==‘r‘){
      umin(ul[d],j);
      umax(ur[d],j);
    }
    ul[d]=ym-ul[d];
    ur[d]=ur[d]-ym;
  }
  for(i=xm;i<=xr;i++){
    d=i-xm;
    dl[d]=inf;dr[d]=0;
    for(j=yl;j<=yr;j++)if(a[i][j]==‘r‘){
      umin(dl[d],j);
      umax(dr[d],j);
    }
    dl[d]=ym-dl[d];
    dr[d]=dr[d]-ym;
  }
  mu=xm-xl;
  md=xr-xm;
  for(i=1;i<=n;i++)for(j=1;j<=n;j++)f[i][j]=0;
  for(i=1;i<=n;i++){
    fu[0]=fd[n+1]=inf;
    for(j=1;j<=n;j++)if(a[j][i]==‘X‘)fu[j]=0;else fu[j]=fu[j-1]+1;
    for(j=n;j;j--)if(a[j][i]==‘X‘)fd[j]=0;else fd[j]=fd[j+1]+1;
    for(j=1;j<=n;j++){
      l=n;
      if(fu[j]<=mu)umin(l,i-ur[fu[j]]);
      if(fd[j]<=md)umin(l,i-dr[fd[j]]);
      r=1;
      if(fu[j]<=mu)umax(r,i+ul[fu[j]]);
      if(fd[j]<=md)umax(r,i+dl[fd[j]]);
      umax(l,1),umin(r,n);
      if(l<=r)f[j][l]++,f[j][r+1]--;
    }
  }
  for(i=1;i<=n;i++)for(j=1;j<=n;j++){
    f[i][j]+=f[i][j-1];
    if(f[i][j])ban[i][j]=1;
  }
  f11=f1n=fn1=fnn=inf;
  for(i=1;i<=md;i++){
    umin(f11,i+dr[i]+1);
    umin(f1n,i+dl[i]+1);
    umin(fn1,i+ur[i]+1);
    umin(fnn,i+ul[i]+1);
  }
  for(i=yl;i<=ym;i++){
    d=ym-i;
    ul[d]=inf;ur[d]=0;
    for(j=xl;j<=xr;j++)if(a[j][i]==‘r‘){
      umin(ul[d],j);
      umax(ur[d],j);
    }
    ul[d]=xm-ul[d];
    ur[d]=ur[d]-xm;
  }
  for(i=ym;i<=yr;i++){
    d=i-ym;
    dl[d]=inf;dr[d]=0;
    for(j=xl;j<=xr;j++)if(a[j][i]==‘r‘){
      umin(dl[d],j);
      umax(dr[d],j);
    }
    dl[d]=xm-dl[d];
    dr[d]=dr[d]-xm;
  }
  mu=ym-yl;
  md=yr-ym;
  for(i=1;i<=n;i++)for(j=1;j<=n;j++)f[i][j]=0;
  for(i=1;i<=n;i++){
    fu[0]=fd[n+1]=inf;
    for(j=1;j<=n;j++)if(a[i][j]==‘X‘)fu[j]=0;else fu[j]=fu[j-1]+1;
    for(j=n;j;j--)if(a[i][j]==‘X‘)fd[j]=0;else fd[j]=fd[j+1]+1;
    for(j=1;j<=n;j++){
      l=n;
      if(fu[j]<=mu)umin(l,i-ur[fu[j]]);
      if(fd[j]<=md)umin(l,i-dr[fd[j]]);
      r=1;
      if(fu[j]<=mu)umax(r,i+ul[fu[j]]);
      if(fd[j]<=md)umax(r,i+dl[fd[j]]);
      umax(l,1),umin(r,n);
      if(l<=r)f[l][j]++,f[r+1][j]--;
    }
  }
  for(i=1;i<=n;i++)for(j=1;j<=n;j++){
    f[i][j]+=f[i-1][j];
    if(f[i][j])ban[i][j]=1;
  }
  for(h=i=1;i<=n;i++)for(j=1;j<=n;j++)f[i][j]=-1;
  add(xm,ym,0);
  while(h<=t){
    x=q[h][0],y=q[h++][1],z=f[x][y]+1;
    add(x+1,y,z);
    add(x-1,y,z);
    add(x,y+1,z);
    add(x,y-1,z);
  }
  if(ans<inf)printf("%d",ans);else puts("NIE");
  return 0;
}

  

时间: 2024-10-08 10:29:17

BZOJ1114 : [POI2008]鲁滨逊逃生Rob的相关文章

POI2008 题解

POI2008 完结(′?_?`)撒花! 海报PLA 单调栈裸题! 激光发射器SZK 光路可逆? 然后证一下发射器与接收器两两对应? 砖块Klo 区间中值! 可用树状数组水过... 将高度 \( h \) 的值域作为树状数组维护的序列,维护一下前缀数量与前缀和即可. BLO 求割点裸题! Sta so easy 的树上DP! CLO 蜜汁构造... Tro 草稿题... 把差积分开算,求和 枪战Maf 有向仙人掌? naive! 贪心构造即可(<--口胡的) 正解还要分好多种情况? 账本BBB

洛谷 P1343 地震逃生

题目描述 汶川地震发生时,四川**中学正在上课,一看地震发生,老师们立刻带领x名学生逃跑,整个学校可以抽象地看成一个有向图,图中有n个点,m条边.1号点为教室,n号点为安全地带,每条边都只能容纳一定量的学生,超过楼就要倒塌,由于人数太多,校长决定让同学们分成几批逃生,只有第一批学生全部逃生完毕后,第二批学生才能从1号点出发逃生,现在请你帮校长算算,每批最多能运出多少个学生,x名学生分几批才能运完. 输入输出格式 输入格式: 第一行3个整数n,m,x(x<2^31,n<=200,m<=20

BZOJ1124: [POI2008]枪战Maf

1124: [POI2008]枪战Maf Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 501  Solved: 200[Submit][Status][Discuss] Description 有n个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开枪.因此,对于不同的开枪顺序,最后死的人也不同. Input 输入n人数<1000000 每个人的aim Output 你要求最

1131: [POI2008]Sta

1131: [POI2008]Sta Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 783  Solved: 235[Submit][Status] Description 给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大 Input 给出一个数字N,代表有N个点.N<=1000000 下面N-1条边. Output 输出你所找到的点,如果具有多个解,请输出编号最小的那个. Sample Input 8 1 4 5 6

BZOJ 1113: [Poi2008]海报PLA

题目 1113: [Poi2008]海报PLA Time Limit: 10 Sec  Memory Limit: 162 MB Description N个矩形,排成一排. 现在希望用尽量少的矩形海报Cover住它们. Input 第一行给出数字N,代表有N个矩形.N在[1,250000] 下面N行,每行给出矩形的长与宽.其值在[1,1000000000]2 1/2 Postering Output 最少数量的海报数. Sample Input 5 1 2 1 3 2 2 2 5 1 4 Sa

AC日记——[POI2008]BLO-Blockade 洛谷 [POI2008]BLO-Blockade

[POI2008]BLO-Blockade 思路: tarjan: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 #define maxm 500005 #define ll long long ll Count[maxn],E[maxm<<1],V[maxm<<1],head[maxn],cnt; ll size[maxm],dfn[maxn],n,m,tot,low[max

bzoj1112[POI2008]砖块Klo*

bzoj1112[POI2008]砖块Klo 题意: N柱砖,希望有连续K柱的高度是一样的. 你可以选择以下两个动作 1:丢掉某柱砖的一块砖.给某柱加上一块砖,现在希望用最小次数的动作完成任务.N≤100000 题解: 设一个区间长度为k,其中位数为a,比a小的元素个数为b,和为c:比a大的元素个数为d,和为e.则题目要求维护一个长度为k的滑动窗口,能求出它的b*a-c+e-d*a.故用一个维护sum,size两个值的treap来维护.然而似乎我想复杂了?比所有人代码都大1k!注意要开long

hdu-4857 逃生(拓扑序)

题目链接: 逃生 Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 32768/32768 K (Java/Others) Problem Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b之前.同时,社会是不平等的,这些人有的穷有的富.1号最富,2号第二富,以此类推.有钱人就贿赂负责人,所以他们有一些好处

hdu 4857 逃生(拓扑逆排序+优先队列)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4857 ---------------------------------------------------------------------------------------------------------------------------------------------------------- 欢迎光临天资小屋:http://user.qzone.qq.com/593830943