BD202418激光控制器(前缀和)

小度一直对外太空充满向往,这次他购买了多台激光发射器,希望通过向天空发射信号来与太空取得联系。
每台激光发射器都配备了一个控制器,初始状态下,所有激光发射器都朝向北方。
控制器每拨动一次,激光发射器便会顺时针旋转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;
}
  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值