Time Limit: 25 Sec  Memory Limit: 256 MB
Submit: 77  Solved: 34
[
Submit][Status][Discuss]

Description

农夫小Q将他的奶牛们饲养在一个长n宽m的矩形网格牧场中。行从上到下依次编号为1到n,列从左往右依次编号为1

到m。为了防止奶牛们逃跑,小Q在牧场外圈安装了一排电网,只要奶牛走出这个n*m的矩形,就会触电死去。在牧

场中,有e个格子塌陷了,一旦奶牛踩在上面,就会掉下去摔死。小Q为了饲养尽可能多的奶牛,在每个没有塌陷的

格子上,都饲养着一头奶牛。tangjz偷走了小Q的口哨,并用口哨向奶牛们依次施放了q条指令,每条指令包含两个

参数d和k,d表示上下左右之一的方向,k表示前进步数。发出指令后,每头奶牛都会听话地执行指令,甚至会因此

丧生。所有奶牛移动完毕之后,tangjz才会施放下一条指令。请写一个程序统计每条指令中小Q损失了多少头奶牛

Input

第一行包含4个正整数n,m,e,q(1<=n,m,q<=2000,0<=e<=min(nm,2000))

分别表示牧场的长宽、塌陷的格子数以及指令数。

接下来e行,每行两个正整数x_i,y_i(1<=x_i<=n,1<=y_i<=m)

表示每个塌陷格子的坐标。输入数据保证每个格子不会被描述多次。

接下来q行,每行包含一个字符d和一个正整数k(1<=k<=2000)

描述每条指令。其中UDLR分别表示上下左右。

Output

输出q行,每行一个整数,即第i条指令中损失的奶牛数量。

Sample Input

3 5 3 4
1 4
2 2
3 3
R 2
L 1
D 2
U 1

Sample Output

10
0
2
0

题解:

      ①观察数据发现障碍物非常少,不超过2000,因此将移动牛反过来换成移动障碍物。

      ②但是每次移动每个障碍物并杀死牛这种暴力时间复杂度为:O(n3),需要优化:

      ③使用链表优化,分别表示四个方向上指向的最近的没有被杀死的牛的位置。

      ④链表的实现有的人说是并查集……QAQ

  1. #include<cstdio>
  2. #define Fa fa[_]
  3. #define go(i,a,b) for(int i=a;i<=b;i++)
  4. const int N=2003;struct P{int x,y;}a[10010];
  5. int n,m,e,q,ans,k,fa[5][N][N],_;bool dead[N][N];char c;
  6. void Kill(int x,int y)
  7. {
  8. if(dead[x][y])return;ans+=(dead[x][y]=1);
  9. fa[0][x][y]--;fa[1][x][y]++;fa[2][x][y]--;fa[3][x][y]++;
  10. }
  11. int find01(int x,int y){return Fa[x][y]==x?x:Fa[x][y]=find01(Fa[x][y],y);}
  12. int find23(int x,int y){return Fa[x][y]==y?y:Fa[x][y]=find23(x,Fa[x][y]);}
  13.  
  14. void Up(){_=0;go(i,1,e)
  15. {
  16. int x=a[i].x,y=a[i].y;a[i].x-=k;
  17. if(y<1||y>m||x<1)continue;if(x>n)x=n;
  18. while((x=find01(x,y))>=1&&x>=a[i].x)Kill(x,y);
  19. }
  20. }
  21. void Down(){_=1;go(i,1,e)
  22. {
  23. int x=a[i].x,y=a[i].y;a[i].x+=k;
  24. if(y<1||y>m||x>n)continue;if(x<1)x=1;
  25. while((x=find01(x,y))<=n&&x<=a[i].x)Kill(x,y);
  26. }
  27. }
  28. void Left(){_=2;go(i,1,e)
  29. {
  30. int x=a[i].x,y=a[i].y;a[i].y-=k;
  31. if(x<1||x>n||y<1)continue;if(y>m)y=m;
  32. while((y=find23(x,y))>=1&&y>=a[i].y)Kill(x,y);
  33. }
  34. }
  35. void Right(){_=3;go(i,1,e)
  36. {
  37. int x=a[i].x,y=a[i].y;a[i].y+=k;
  38. if(x<1||x>n||y>m)continue;if(y<1)y=1;
  39. while((y=find23(x,y))<=m&&y<=a[i].y)Kill(x,y);
  40. }
  41. }
  42. int main()
  43. {
  44. scanf("%d%d%d%d",&n,&m,&e,&q);
  45. go(i,0,n+1)go(j,0,m+1)fa[0][i][j]=fa[1][i][j]=i,fa[2][i][j]=fa[3][i][j]=j;
  46. go(i,1,e)scanf("%d %d",&a[i].x,&a[i].y),Kill(a[i].x,a[i].y);
  47. go(i,1,n)a[++e].x=i,a[e].y=0,a[++e].x=i,a[e].y=m+1;
  48. go(i,1,m)a[++e].x=0,a[e].y=i,a[++e].x=n+1,a[e].y=i;
  49. while(ans=0,q--&&scanf(" %c%d",&c,&k))
  50. {
  51. c=='U'?Down(),1:1,c=='D'?Up(),1:1,c=='R'?Left(),1:1,c=='L'?Right(),1:1;
  52. printf("%d\n",ans);
  53. }return 0;
  54. }//Paul_Guderian

回首往事我明白了他曾叮咛的,所有那些平淡无味的话语.

那年我五岁,爸爸对我说,学一点东西,否则你会一事无成。————汪峰《那年我五岁》

【BZOJ 5048 塌陷的牧场】的更多相关文章

  1. bzoj5048: 塌陷的牧场

    Description 农夫小Q将他的奶牛们饲养在一个长n宽m的矩形网格牧场中.行从上到下依次编号为1到n,列从左往右依次编号为1 到m.为了防止奶牛们逃跑,小Q在牧场外圈安装了一排电网,只要奶牛走出 ...

  2. bzoj 1602 [Usaco2008 Oct]牧场行走(LCA模板)

    1602: [Usaco2008 Oct]牧场行走 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 379  Solved: 216[Submit][Sta ...

  3. BZOJ 1602: [Usaco2008 Oct]牧场行走( 最短路 )

    一棵树..或许用LCA比较好吧...但是我懒...写了个dijkstra也过了.. ---------------------------------------------------------- ...

  4. LCA || BZOJ 1602: [Usaco2008 Oct]牧场行走 || Luogu P2912 [USACO08OCT]牧场散步Pasture Walking

    题面:[USACO08OCT]牧场散步Pasture Walking 题解:LCA模版题 代码: #include<cstdio> #include<cstring> #inc ...

  5. BZOJ 1602: [Usaco2008 Oct]牧场行走 倍增裸题

    Description N头牛(2<=n<=1000)别人被标记为1到n,在同样被标记1到n的n块土地上吃草,第i头牛在第i块牧场吃草. 这n块土地被n-1条边连接. 奶牛可以在边上行走, ...

  6. BZOJ——1602: [Usaco2008 Oct]牧场行走 || 洛谷—— P2912 [USACO08OCT]牧场散步Pasture Walking

    http://www.lydsy.com/JudgeOnline/problem.php?id=1602 || https://www.luogu.org/problem/show?pid=2912 ...

  7. BZOJ 1602 USACO2008 Oct 牧场行走

    翻翻吴大神的刷题记录翻到的... 乍一看是一个树链剖分吓瓜我...难不成吴大神14-10-28就会了树剖?orz... 再一看SB暴力都可过... 然后一看直接树上倍增码个就好了... 人生真是充满着 ...

  8. WOJ 39 塌陷的牧场

    感觉……做克老师的题,都很神仙…… 还有去年一个人坐在家里写挂60分算法的惨痛记忆,凭借着一点点记忆重新写这道题. 感觉这并查集真的很神仙,仍然不会算最后的α的复杂度……自己想感觉无论如何都要挂个lo ...

  9. BZOJ 1602 [Usaco2008 Oct]牧场行走 dfs

    题意:id=1602">链接 方法:深搜暴力 解析: 这题刚看完还有点意思,没看范围前想了想树形DP,只是随便画个图看出来是没法DP的,所以去看范围. woc我没看错范围?果断n^2暴 ...

随机推荐

  1. linux:eth网卡对应的物理网口判断

    可以利用ethtool命令 #ethtool -p eth0 执行上述命令则相应的物理网口会闪烁,则可以判断对应的物理网口 注:应在不插网线的情况下测试

  2. ayui弹出层闪退,layer弹出层闪退,layer弹出层坑

    今天用layui的弹出层插件,发现两奇怪的问题: 1.弹窗打开事件还未绑定到任何按钮,可是点击form表单中的按钮可以打开我定义的弹出层 2.绑定弹出层到按钮,打开弹窗闪退 后面发现真如参考博文所说: ...

  3. 硬盘安装Windows Server 2008(解决系统盘符变成D盘)

    硬盘安装Windows 2008系统方法 操作系统最好用的无疑是server 2003,但是现在Server 2003支持的软件越来越少,很多是故意不支持Server 2003了, 像php5.5以上 ...

  4. python—— 文件的打开模式和文件对象方法 & os、os.path 模块中关于文件、目录常用的函数使用方法

    引用自“鱼c工作室”     文件的打开模式和文件对象方法  : https://fishc.com.cn/forum.php?mod=viewthread&tid=45279&ext ...

  5. JS实现禁用滑动条但滑动条不消失的效果

    //方法 //滑动条 // left: 37, up: 38, right: 39, down: 40, // spacebar: 32, pageup: 33, pagedown: 34, end: ...

  6. 笔记-docker-1

    笔记-docker-1 1.      简介 1.1.    什么是Docker? Docker 是世界领先的软件容器平台.开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问 ...

  7. 点击EditText可编辑,点击其他地方不可编辑

    我是在Fragment中实现的,在网上查了,有的说要回调Activity的onTouch事件,通过实验直接在Fragment中即可.如下: 我的EditText在ScrollView,因为Scroll ...

  8. com.squareup.okhttp.Interceptor

    retrift 集成了okhttp,所以,我们以后就不用再单独的引用http的jar 了. 但是,今天遇到一个问题,就是okhttp是这样设置一些intercept的: private static ...

  9. JavaScript获取时间

    var myDate = new Date();            console.log(myDate.getFullYear()); //获取完整的年份(4位,1970-????)       ...

  10. nodejs安装&bower 安装

    1.进入官网下载:https://nodejs.org/en/ 2.直接进行安装,可以将安装路径设置为:D:\nodejs 3.进入node.js command prompt 命令窗口 4.检测是否 ...