小度一直对外太空充满向往,这次他购买了多台激光发射器,希望通过向天空发射信号来与太空取得联系。
每台激光发射器都配备了一个控制器,初始状态下,所有激光发射器都朝向北方。
控制器每拨动一次,激光发射器便会顺时针旋转90度。
因此,随着控制器的多次拨动,激光的朝向将按照“北-东-南-西-北”的顺序循环变化。
这些控制器整齐地排列在一条直线上,可以被视为一条坐标轴,每个整数单位上对应一个控制器。
小度从原点出发,计划进行N次连续的操作。每次操作从当前坐标上的控制器开始,连续拨动一个区间内的所有控制器,并停留在最后一个控制器的位置,拨动包含当前控制器以及最后停留位置对应的控制器。
每次操作用一个整数和一个字符 x cx c 表示,其中 xx 代表从当前控制器开始连续拨动多少个控制器,cc 表示拨动方向。
cc 为字符 RR 时,表示沿坐标向右操作;cc 为字符 LL 时,表示沿坐标向左操作。
例如, 3 L3 L 表示从当前控制器起向左拨动3个控制器。1 R1 R 表示从当前控制器起向右拨动1个控制器,即停留在当前位置。
通过这种方式,小度可以控制激光发射器的朝向,并向太空发射出特定的信号。
现在给你小度的操作序列,希望你能告诉他最终朝向东方的激光器有多少台。
格式
输入格式:
第 1 行读入 1 个整数 NN,代表操作次数。 (1≤N≤1∗105)(1≤N≤1∗105);
第 22 到 N+1N+1 行,每行一个整数一个字符 x cx c,表示每次拨动的数量和方向。数据保障小度不会偏离原点 1∗1091∗109 个单位。
输出格式:
一个整数,表示最终朝向东方的激光器有多少台。
样例 1
输入:
4
5 R
5 R
1 L
5 R
输出:
11
样例 2
输入:
5
5 R
10 L
6 R
3 L
4 R
输出:
1
备注
样例1解释:
5 R 拨动【0,1,2,3,4】,当前位置为4;
5 R 拨动【4,5,6,7,8】,当前位置为8;
1 L 拨动【8】,当前位置为8;
5 R 拨动【8,9,10,11,12】当前位置为12;
朝向东方的有拨动一次的【0,1,2,3,5,6,7,9,10,11,12】所以答案为11。
C++:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e8+5;
struct node
{
int x;
int y;
}d[maxn];
int main()
{
int n;cin>>n;
int t=0; //起始点0
map<int,int>mp; //mp代表前缀和
//因为数组的下标不能为负数,但是map的键可以为负数
for(int i=1;i<=n;i++)
{
int a;char c;cin>>a>>c;
if(c=='R') //向右
{
mp[t]++;
t+=a-1;
mp[t+1]--;
}
else //向左
{
mp[t+1]--;
t+=-a+1;
mp[t]++;
}
}
int tmp=0;int ans=0;
map<int,int>::iterator it;
for(it=mp.begin();it!=mp.end();it++)
//迭代器遍历,因为map自动排序且去重,所以无须考虑拨动控制器最左或者最右移动多少台
//d数组的first代表每个转折点的坐标
//d数组的second代表每个转折点被波动的次数
//mp的键映射而成的值,代表它的变化量,例mp[2]++,mp[5]--即代表2,3,4上的控制器波动次数+1
{
tmp++;
d[tmp].x=it->first;
d[tmp].y=it->second;
}
for(int i=1;i<=tmp;i++)
{
d[i].y+=d[i-1].y; //此时d数组的y坐标为每个转折点的最终拨动次数
if(d[i].y%4==1) //1,5,9...4*n+1
{
ans+=d[i+1].x-d[i].x;
}
}
cout<<ans<<endl;
return 0;
}