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

还有去年一个人坐在家里写挂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. nyoj-952-最大四边形 (向量叉乘)

    题目链接 /* Name:nyoj-952-最大四边形 Copyright: Author: Date: 2018/4/27 10:46:24 Description: 枚举一条对角线,再选择一个 看 ...

  2. HDU - 5126 stars (CDQ分治)

    题目链接 题目大意:一共有Q(1<=Q<=50000)组操作,操作分为两种: 1.在x,y,z处添加一颗星星 2.询问以(x1,y1,z1)与(x2,y2,z2)为左上和右下顶点的矩形之间 ...

  3. angular 的杂碎报错小知识

    1:[ng:areq] Angular出现这种错误的原因,是由于没有在页面中使用模块引入controller导致的 所以 请确保你定义了这个controller后也引用了它. 2:Failed to ...

  4. BZOJ2096:[POI2010]Pilots

    浅谈队列:https://www.cnblogs.com/AKMer/p/10314965.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php?i ...

  5. bae3.0第二步 添加一个空的django项目

    1.创建django项目: 进入bae应用源码目录(appidd01iud80bg)执行django-admin.py startproject blog2.修改index.py的内容如下所示 #-* ...

  6. 环形缓冲区的应用ringbuffer

    在嵌入式开发中离不开设备通信,而在通信中稳定性最高的莫过于环形缓冲区算法, 当读取速度大于写入速度时,在环形缓冲区的支持下不会丢掉任何一个字节(硬件问题除外). 在通信程序中,经常使用环形缓冲区作为数 ...

  7. pos机的热敏纸尺寸

    57x50或者是57x30,两个型号宽度都是一样的,只是厚度不一样,前者是厚一点,适合固定机用,后者适合移动POS机用 厚度不是指纸的厚度,而是纸的容量,移动机的纸槽较小只能用57X30的

  8. SignalR推送服务在Android的实现 SignalA

    SignalA是老外写的用于实现.net端推送消息至安卓端的实现,支持版本为android 2.3或以上,由于我的版本最低是2.2,所以只有把源码下下来自己改,如果你觉得太多了可自己编译成jar引用, ...

  9. Linux常用的编辑保存退出命令

    Vi Vim进入编辑后退出 按ESC后 1.保存退出 :wq :x 最快捷的方法:直接按shift+zz,或者切换到大写模式按ZZ,就可以保存退出了,即是按2下大写的Z.区别::wq 强制性写入文件并 ...

  10. CIA泄露资料分析(黑客工具&技术)—Windows篇

    背景 近期,维基解密曝光了一系列据称来自美国中央情报局(CIA)网络攻击活动的秘密文件,代号为“Vault 7”,被泄露文件的第一部分名为“Year Zero”,共有8761个文件,包含7818个网页 ...