感觉……做克老师的题,都很神仙……

还有去年一个人坐在家里写挂60分算法的惨痛记忆,凭借着一点点记忆重新写这道题。

感觉这并查集真的很神仙,仍然不会算最后的α的复杂度……自己想感觉无论如何都要挂个log

考虑到每个格子移动相当于所有障碍物反向移动,我们可以把边界也当成是障碍物,利用并查集来维护障碍物移动后位置中间还有多少个可以删减的答案,处理完这些答案就好了。

由于一共$n * m$个数据点每个最多被删减一遍,所以并不会超时。

Code:

#include <cstdio>
#include <iostream>
using namespace std;
typedef pair <int, int> pin; const int N = ; int n, m, e, qn, tot = , ans, f[][N][N];
bool vis[N][N];
pin a[N << ]; inline void read(int &X) {
X = ;
char ch = ;
int op = ;
for(; ch > '' || ch < ''; ch = getchar())
if(ch == '-') op = -;
for(; ch >= '' && ch <= ''; ch = getchar())
X = (X << ) + (X << ) + ch - ;
X *= op;
} inline void init() {
for(int i = ; i <= n + ; i++)
for(int j = ; j <= m + ; j++)
f[][i][j] = f[][i][j] = i, f[][i][j] = f[][i][j] = j;
} int find01(int x, int y, int k) {
return f[k][x][y] == x ? x : f[k][x][y] = find01(f[k][x][y], y, k);
} int find23(int x, int y, int k) {
return f[k][x][y] == y ? y : f[k][x][y] = find23(x, f[k][x][y], k);
} inline void del(int x, int y) {
if(vis[x][y]) return;
vis[x][y] = ;
f[][x][y]--, f[][x][y]++, f[][x][y]--, f[][x][y]++;
ans++;
} inline void goup(int k) {
for(int i = ; i <= tot; i++) {
int x = a[i].first, y = a[i].second;
a[i].first -= k;
if(y < || y > m || x < ) continue;
if(x > n) x = n;
for(; ; ) {
x = find01(x, y, );
if(x < || x < a[i].first) break;
del(x, y);
}
}
} inline void godown(int k) {
for(int i = ; i <= tot; i++) {
int x = a[i].first, y = a[i].second;
a[i].first += k;
if(y < || y > m || x > n) continue;
if(x < ) x = ;
for(; ; ) {
x = find01(x, y, );
if(x > n || x > a[i].first) break;
del(x, y);
}
}
} inline void goleft(int k) {
for(int i = ; i <= tot; i++) {
int x = a[i].first, y = a[i].second;
a[i].second -= k;
if(x < || x > n || y < ) continue;
if(y > m) y = m;
for(; ; ) {
y = find23(x, y, );
if(y < || y < a[i].second) break;
del(x, y);
}
}
} inline void goright(int k) {
for(int i = ; i <= tot; i++) {
int x = a[i].first, y = a[i].second;
a[i].second += k;
if(x < || x > n || y > m) continue;
if(y < ) y = ;
for(; ; ) {
y = find23(x, y, );
if(y > m || y > a[i].second) break;
del(x, y);
}
}
} int main() {
read(n), read(m), read(e), read(qn);
init();
for(int x, y, i = ; i <= e; i++) {
read(x), read(y);
a[++tot] = pin(x, y);
del(x, y);
}
for(int i = ; i <= m; i++)
a[++tot] = pin(, i), a[++tot] = pin(n + , i);
for(int i = ; i <= n; i++)
a[++tot] = pin(i, ), a[++tot] = pin(i, m + ); for(char op[]; qn--; ) {
scanf("%s", op);
int k; read(k); ans = ;
if(op[] == 'U') godown(k);
if(op[] == 'D') goup(k);
if(op[] == 'L') goright(k);
if(op[] == 'R') goleft(k); printf("%d\n", ans);
} return ;
}

WOJ 39 塌陷的牧场的更多相关文章

  1. bzoj5048: 塌陷的牧场

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

  2. 【BZOJ 5048 塌陷的牧场】

    Time Limit: 25 Sec  Memory Limit: 256 MBSubmit: 77  Solved: 34[Submit][Status][Discuss] Description ...

  3. bzoj1725 [Usaco2006 Nov]Corn Fields牧场的安排(状压dp)

    1725: [Usaco2006 Nov]Corn Fields牧场的安排 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 714  Solved: 502 ...

  4. CSS浮动布局带来的高度塌陷以及其解决办法

    1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...

  5. 【转】39个让你受益的HTML5教程

    闲话少说,本文作者为大家收集了网上学习HTML5的资源,期望它们可以帮助大家更好地学习HTML5. 好人啊! 不过,作者原来说的40个只有39个,因为第5个和第8个是重复的. 原文在此! 1. 五分钟 ...

  6. C#开发微信门户及应用(39)--使用微信JSSDK实现签到的功能

    随着微信开逐步开放更多JSSDK的接口,我们可以利用自定义网页的方式来调用更多微信的接口,实现我们更加丰富的界面功能和效果,例如我们可以在页面中调用各种手机的硬件来获取信息,如摄像头拍照,GPS信息. ...

  7. CSharpGL(39)GLSL光照示例:鼠标拖动太阳(光源)观察平行光的漫反射和镜面反射效果

    CSharpGL(39)GLSL光照示例:鼠标拖动太阳(光源)观察平行光的漫反射和镜面反射效果 开始 一图抵千言.首先来看鼠标拖动太阳(光源)的情形. 然后是鼠标拖拽旋转模型的情形. 然后我们移动摄像 ...

  8. 外边距塌陷之clearance

    在一个BFC中,垂直方向上相邻的块级盒子产生外边距塌陷,本文要说一个特殊的外边距塌陷情况,即当垂直方向上,两个块级盒子之间有个浮动元素相隔时,这个时候会产生什么样的效果呢? .outer{ overf ...

  9. 抱歉!15:44-16:39阿里云RDS故障造成全站不能正常访问

    非常非常抱歉!2016年3月7日15:44-16:39,由于阿里云RDS(云数据库)故障,造成全站不能正常访问,给您带来了很大很大的麻烦,恳请您的谅解! 故障是在15:44开始出现的,应用日志中出现大 ...

随机推荐

  1. python_判断字符串编码的方法

    1. 安装chardet 在命令行中,进入Python27\Scripts目录,输入以下的命令:easy_install chardet 2. 操作 import chardet f = open(' ...

  2. Git和Github使用说明

    1. 安装 官网地址:https://git-scm.com/downloads 我这里使用的是git version 2.19.1.windows.1,全程傻瓜式安装,点下一步即可,可以把命令模式和 ...

  3. 转载:Java就业企业面试问题-电商项目

    转载: http://blog.csdn.net/qq_33448669/article/details/73657642

  4. VI编辑器、ipython、jupyter及进程

    VI编辑器.ipython.jupyter及进程知识总结 https://www.cnblogs.com/thoughtful-actors/p/9650959.html VI编辑器.ipython. ...

  5. linux大于2T的磁盘格式化

    fdisk默认只能格式小于2T的磁盘,我们经常会碰到大于2T的磁盘,我们不能fdisk 格式化. 我们得用parted 来的格式化 parted 命令可能没有,yum install -y parte ...

  6. Unity3D自定义资源配置文件

    http://blog.csdn.net/candycat1992/article/details/52181814 写在前面 我竟然最近两天才知道Unity中ScriptableObject的存在… ...

  7. 增加虚拟机ubuntu的硬盘

    20150526更新验证日记: (1)首先在虚拟机中增加ubuntu的硬盘大小. (2)在ubuntu中使用Gparted软件对新的空间进行分配(傻瓜式) (3)不能直接将磁盘挂载到home下,只能先 ...

  8. gulp之sass 监听文件,自动编译

    gulpfile.js文件如下: var gulp = require('gulp'); var sass = require('gulp-sass'); gulp.task('default', f ...

  9. hdu 3932 Groundhog Build Home——模拟退火

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3932 注意平均值与最远的点距离为0的情况.所以初值设成-1,这样 id 就不会乱.不过设成0也可以.注意判 ...

  10. CF 19E Fairy——树上差分

    题目:http://codeforces.com/contest/19/problem/E 去掉一条边,使无向图变成二分图. 该边应该被所有奇环经过,且不被偶环经过. 因为一条非树边一定只在一个环里. ...