Old MacDonald has a farm and a large potato field, (1010 + 1) × (1010 + 1) square meters in size. The field is divided into square garden beds, each bed takes up one square meter.

Old McDonald knows that the Colorado potato beetle is about to invade his farm and can destroy the entire harvest. To fight the insects, Old McDonald wants to spray some beds with insecticides.

So Old McDonald went to the field, stood at the center of the central field bed and sprayed this bed with insecticides. Now he's going to make a series of movements and spray a few more beds. During each movement Old McDonald moves left, right, up or down the field some integer number of meters. As Old McDonald moves, he sprays all the beds he steps on. In other words, the beds that have any intersection at all with Old McDonald's trajectory, are sprayed with insecticides.

When Old McDonald finished spraying, he wrote out all his movements on a piece of paper. Now he wants to know how many beds won't be infected after the invasion of the Colorado beetles.

It is known that the invasion of the Colorado beetles goes as follows. First some bed on the field border gets infected. Than any bed that hasn't been infected, hasn't been sprayed with insecticides and has a common side with an infected bed, gets infected as well. Help Old McDonald and determine the number of beds that won't be infected by the Colorado potato beetle.

Input

The first line contains an integer n (1 ≤ n ≤ 1000) — the number of Old McDonald's movements.

Next n lines contain the description of Old McDonald's movements. The i-th of these lines describes the i-th movement. Each movement is given in the format "dixi", where di is the character that determines the direction of the movement ("L", "R", "U" or "D" for directions "left", "right", "up" and "down", correspondingly), and xi (1 ≤ xi ≤ 106) is an integer that determines the number of meters in the movement.

Output

Print a single integer — the number of beds that won't be infected by the Colorado potato beetle.

Please do not use the %lld specifier to read or write 64-bit integers in С++. It is preferred to use the cin, cout streams or the %I64dspecifier.

Sample Input

Input
5 
R 8
U 9
L 9
D 8
L 2
Output
101
Input
7 
R 10
D 2
L 7
U 9
D 2
R 3
D 10
Output
52

题意:有一个非常大的田地(你当它是无穷大的),每一格大小是1m*1m,主人公要喷杀虫剂,他从起点开始,可以朝U(上),D(下),L(左),R(右)四个方向走一段距离,则这段路上的格子都被喷了杀虫剂,
给出N次操作,每次输入一个字符和数字,分别代表方向和路程。害虫入侵田地的方式是从外围入侵,如果某个相邻的格子没有被喷杀虫剂则可以蔓延。最后要求出剩下没被入侵的总面积。 解析:田地太大,面积太大,直接搜是不可能的,但是N最大只有1000,那么可以考虑把x坐标y坐标离散化,点最多也就上千,这里有一个技巧,就是离散化后的点扩大两倍,为了后面方便bfs,所以我把
最外围扩了一圈,那么离散的坐标就是1,3,5.....2*k+1。 0和2*k+2是外围。我把整个图压缩成了一维,比如(x,y)对应的下标就是x*列宽+y,接下来就是bfs,先把走过的地方全部标记为1,其他地方
标记为-1,此时我只需要把(0,0)加入队列搜即可(你可以仔细想一下为什么),把能够走的地方全部标记为0。但是要注意一点,因为我是扩大了两倍,如果当前搜的方向是上或下,且这个点的y坐标是偶数
(不是边界),需要判断一下离散化的左右两个数的差值是否为1,是的话是不能走的(被堵死了),因为这个点本就是虚拟的点。如果当前搜的方向是左或右,x坐标是偶数(不是边界)同理。最后就是计算总
面积,如果这个点不是标记为0(不能被害虫入侵),则判断它的x,y坐标的奇偶性,x,y同时为奇数则加1,x为偶数,则加x轴方向的距离-1,y为偶数,则加y轴方向的距离-1,都是偶数则加两个方向的距离-1
的乘积。(注意会爆int)
代码
#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
#include<sstream>
#include<algorithm>
#include<utility>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<cmath>
#include<iterator>
#include<stack>
using namespace std;
typedef __int64 LL;
const int INF=1e9+;
const double eps=1e-;
const int maxn=;
int M,wx[maxn],wy[maxn];
int tempx[maxn],tempy[maxn],row,col;
int dx[]={-,,,},dy[]={,-,,};
int maze[];
bool in(int x,int y){ return x>=&&x<row*+&&y>=&&y<col*+; }//是否在界内
int GetId(int x,int y){ return x*(col*+)+y; }
void Print(int A[],int N)
{
for(int i=;i<=N;i++) printf("%d ",A[i]);
puts("");
}
void init()
{
for(int i=;i<=M;i++) tempx[i]=wx[i],tempy[i]=wy[i];
sort(tempx,tempx+M+); //下面是离散化过程
sort(tempy,tempy+M+);
row=col=;
for(int i=;i<=M;i++) if(tempx[i]!=tempx[row]) tempx[++row]=tempx[i]; //去重
for(int i=;i<=M;i++) if(tempy[i]!=tempy[col]) tempy[++col]=tempy[i];
}
struct node
{
int x,y;
node(int x=,int y=):x(x),y(y){}
};
queue<node> que;
void bfs()
{
memset(maze,-,sizeof(maze));
for(int i=;i<=M;i++)
{
int x1=lower_bound(tempx,tempx+row+,wx[i-])-tempx; //找对应离散化后的值
int y1=lower_bound(tempy,tempy+col+,wy[i-])-tempy;
int x2=lower_bound(tempx,tempx+row+,wx[i])-tempx;
int y2=lower_bound(tempy,tempy+col+,wy[i])-tempy;
x1=x1*+; y1=y1*+; x2=x2*+; y2=y2*+; //扩大
if(x1==x2)
{
if(y1>y2) swap(y1,y2);
for(int st=y1;st<=y2;st++) maze[GetId(x1,st)]=; //做标记
}
else if(y1==y2) //同理
{
if(x1>x2) swap(x1,x2);
for(int st=x1;st<=x2;st++) maze[GetId(st,y1)]=;
}
}
while(!que.empty()) que.pop();
que.push(node(,)); //把(0,0)丢进队列
maze[GetId(,)]=;
while(!que.empty())
{
node& t=que.front(); que.pop();
int x=t.x,y=t.y;
for(int i=;i<;i++)
{
int nx=x+dx[i];
int ny=y+dy[i];
if(!in(nx,ny)) continue; //出界不管
int id=GetId(nx,ny);
if(ny%==&&(i==||i==)&&in(nx,ny-)&&in(nx,ny+))//y坐标为偶数且方向是上下,不是外围
{
int a=(ny-)/;
int b=(ny+)/;
if(tempy[b]-tempy[a]-<=) continue; //值差为1不能走
}
if(nx%==&&(i==||i==)&&in(nx-,ny)&&in(nx+,ny)) //同理
{
int a=(nx-)/;
int b=(nx+)/;
if(tempx[b]-tempx[a]-<=) continue;
}
if(maze[id]==-){ que.push(node(nx,ny)); maze[id]=; } //标记为0
}
}
}
LL solve()
{
LL ret=;
bfs();
for(int i=;i<row*+;i++)
for(int j=;j<col*+;j++)
{
int p=GetId(i,j);
if(maze[p]==) continue;
int a=(j+)/,b=(j-)/;
int c=(i+)/,d=(i-)/;
if(i%==&&j%==) ret++; //都是奇数
else if(i%==) ret+=(LL)tempy[a]-tempy[b]-; //x坐标为奇数,y坐标为偶数
else if(j%==) ret+=(LL)tempx[c]-tempx[d]-; //y坐标为奇数,x坐标为偶数
else ret+=(LL)(tempx[c]-tempx[d]-)*(tempy[a]-tempy[b]-); //均为偶数
}
return ret;
}
int main()
{
while(scanf("%d",&M)!=EOF)
{
wx[]=,wy[]=;
for(int i=;i<=M;i++)
{
char c;
int d;
scanf(" %c %d",&c,&d);
wx[i]=wx[i-]; wy[i]=wy[i-];
if(c=='U') wx[i]-=d;
else if(c=='D') wx[i]+=d;
else if(c=='L') wy[i]-=d;
else if(c=='R') wy[i]+=d;
//printf("%d %d\n",wx[i],wy[i]);
}
init();
printf("%I64d\n",solve());
}
return ;
}

Codeforces243C-Colorado Potato Beetle(离散化+bfs)的更多相关文章

  1. Colorado Potato Beetle(CF的某道) & 鬼畜宽搜

    题意: 一个人在一张大图上走,给你路径与起点,求他走出的矩形面积并.(大概这个意思自行百度标题... SOL: 与其说这是一道图论题不如说是一道生动活泼的STL-vector教学.... 离散化宽搜, ...

  2. HDU 5925 Coconuts 【离散化+BFS】 (2016CCPC东北地区大学生程序设计竞赛)

    Coconuts Time Limit: 9000/4500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Su ...

  3. 离散化+BFS HDOJ 4444 Walk

    题目传送门 /* 题意:问一个点到另一个点的最少转向次数. 坐标离散化+BFS:因为数据很大,先对坐标离散化后,三维(有方向的)BFS 关键理解坐标离散化,BFS部分可参考HDOJ_1728 */ # ...

  4. hdu 4400 Mines(离散化+bfs+枚举)

    Problem Description Terrorists put some mines in a crowded square recently. The police evacuate all ...

  5. Codeforces Round #150 (Div. 2)

    A. Dividing Orange 模拟. B. Undoubtedly Lucky Numbers 暴力枚举\(x.y\). C. The Brand New Function 固定左端点,右端点 ...

  6. FZU2235 国王的出游 水题

    因为只有1e5个点,所以直接离散化bfs就好 #include <cstdio> #include <cstring> #include <queue> #incl ...

  7. uva 12171 hdu 1771 Sculpture

    //这题从十一点开始写了四十分钟 然后查错一小时+ 要吐了 这题题意是给很多矩形的左下角(x,y,z最小的那个角)和三边的长(不是x,y,z最大的那个角T-T),为组成图形的面积与表面积(包在内部的之 ...

  8. UVA 12171 Sculpture

    https://vjudge.net/problem/UVA-12171 题目 某人设计雕塑,用的是很扯的方法:把一堆长方体拼起来.给出长方体的坐标和长宽高,求外表面积.因为要将这雕塑进行酸洗,需要知 ...

  9. hdu 4444 Walk (离散化+建图+bfs+三维判重 好题)

    Walk Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submi ...

随机推荐

  1. Centos 6.5中安装后不能打开emacs的问题

    问题的发现过程: 安装了最新的centos版本后发现居然打不开emacs,然后在终端中输入emacs后还是不能打开,出现了下面的提示: emacs: error while loading share ...

  2. Decorator学习笔记

    初学者,自己的理解,请各位前辈不吝指正! Decorator,装饰模式,设计模式之一,谈谈我的理解,装饰这个词在我概念中就是给某个事物加上一些美丽的外表,把它变得更加完美.但是装饰是可以随时改变的,可 ...

  3. 代码高亮插件Codemirror使用方法及下载

    代码高亮插件Codemirror使用方法及下载 - 老男孩的日志 - 网易博客 代码高亮插件Codemirror使用方法及下载   2013-10-31 16:51:29|  分类: 默认分类 |   ...

  4. 跨平台utf8转unicode研究实现(2)

    最近在用VC++开发一个小工具,平时用惯了.NET,用起VC++最郁闷的就是字符串处理.当然最最让人难于琢磨的就是字符集,编码之间的转换.通过这几天的研究,终于明白了Unicode和UTF-8之间编码 ...

  5. [原创作品]html css改变浏览器选择文字的背景和颜色

    又很久没有'剥壳'了,最近在为一家公司做一个生产管理解决方案.所以都很忙.今天的话题很简单,就做一个很简单的网页特效.今天偶然浏览到一个网站,他们在选择文字时,样子不是蓝背景和白色字体那么单调,感觉这 ...

  6. 正则表达式获取URL参数

    使用到的正则表达式: [^\?&]?参数名=[^&]+ document.location.getURLPara = function (name) { var reg = new R ...

  7. WHY IE AGAIN? - string.charAt(x) or string[x]?

    近期今天在写一个"删除字符串中反复字符串"的函数,代码例如以下: 开门见山,重点 string.charAt(index) 取代 string[index] function re ...

  8. [转]iOS开发使用半透明模糊效果方法整理

    转自:http://www.molotang.com/articles/1921.html 虽然iOS很早就支持使用模糊效果对图片等进行处理,但尤其在iOS7以后,半透明模糊效果得到大范围广泛使用.包 ...

  9. <经验杂谈>C#/.Net字符串操作方法小结

    字符串操作是C#中最基本的.最常见的.也是用的最多的,以下我总结 了几种常见的方法 1.把字符串按照分隔符转换成 List /// <summary> /// 把字符串按照分隔符转换成 L ...

  10. 转载: Javah生成JNI头文件出现找不到类的错误

    错误: 找不到 'com.chnic.jni.SayHellotoCPP' 的类文件. 上图可以看到错误和解决办法. 不要忘记那个点 javah -classpath . -jni com.chnic ...