欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Educational Codeforces Round 42 (Rated for Div. 2) E. Byteland, Berland and Disputed Cities

程序员文章站 2024-03-06 21:34:20
...

http://codeforces.com/contest/962/problem/E

E. Byteland, Berland and Disputed Cities
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

The cities of Byteland and Berland are located on the axis OxOx. In addition, on this axis there are also disputed cities, which belong to each of the countries in their opinion. Thus, on the line OxOx there are three types of cities:

  • the cities of Byteland,
  • the cities of Berland,
  • disputed cities.

Recently, the project BNET has been launched — a computer network of a new generation. Now the task of the both countries is to connect the cities so that the network of this country is connected.

The countries agreed to connect the pairs of cities with BNET cables in such a way that:

  • If you look at the only cities of Byteland and the disputed cities, then in the resulting set of cities, any city should be reachable from any other one by one or more cables,
  • If you look at the only cities of Berland and the disputed cities, then in the resulting set of cities, any city should be reachable from any other one by one or more cables.

Thus, it is necessary to choose a set of pairs of cities to connect by cables in such a way that both conditions are satisfied simultaneously. Cables allow bi-directional data transfer. Each cable connects exactly two distinct cities.

The cost of laying a cable from one city to another is equal to the distance between them. Find the minimum total cost of laying a set of cables so that two subsets of cities (Byteland and disputed cities, Berland and disputed cities) are connected.

Each city is a point on the line OxOx. It is technically possible to connect the cities aa and bb with a cable so that the city cc (a<c<ba<c<b) is not connected to this cable, where aabb and cc are simultaneously coordinates of the cities aabb and cc.

Input

The first line contains a single integer nn (2n21052≤n≤2⋅105) — the number of cities.

The following nn lines contains an integer xixi and the letter cici (109xi109−109≤xi≤109) — the coordinate of the city and its type. If the city belongs to Byteland, cici equals to 'B'. If the city belongs to Berland, cici equals to «R». If the city is disputed, cici equals to 'P'.

All cities have distinct coordinates. Guaranteed, that the cities are given in the increasing order of their coordinates.

Output

Print the minimal total length of such set of cables, that if we delete all Berland cities (cici='R'), it will be possible to find a way from any remaining city to any other remaining city, moving only by cables. Similarly, if we delete all Byteland cities (cici='B'), it will be possible to find a way from any remaining city to any other remaining city, moving only by cables.

Examples
input
Copy
4
-5 R
0 P
3 P
7 B
output
Copy
12
input
Copy
5
10 R
14 B
16 B
21 R
32 R
output
Copy
24
Note

In the first example, you should connect the first city with the second, the second with the third, and the third with the fourth. The total length of the cables will be 5+3+4=125+3+4=12.

In the second example there are no disputed cities, so you need to connect all the neighboring cities of Byteland and all the neighboring cities of Berland. The cities of Berland have coordinates 10,21,3210,21,32, so to connect them you need two cables of length 1111 and 1111. The cities of Byteland have coordinates 1414 and 1616, so to connect them you need one cable of length 22. Thus, the total length of all cables is 11+11+2=2411+11+2=24.



思路:

第一感觉,就是把所有的R与P链接起来,然后在把B连接起来,遇到p时,p与p之间的距离就不算了,可是如果是PRP这种还要不要算呢?看来我还需要再读一遍题。

嗯,读题完毕!顺便说一句,上一题,也就是D题,是个傻逼题,只不过我这个傻逼比它更傻逼,所以没有做出来。对于这题,PRP这种结构,连接B时,P与P还是要再连接一次;感觉应该不是很难写,两个遍历时间也就是2*n,也就是4*1e5,应该跑的完(题目的2s让我有些害怕),数据大小达到了1e9,应该是要long long的,结果我想用unsigned long long来存,好吧,就是它了!


#include<iostream>
using namespace std;
struct node
{
    int x;
    char p;
}a[200086];
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a[i].x>>a[i].p;
    }
    unsigned long long ans=0;
    for(int i=1;i<n;i++){
        if(a[i].p==a[i-1].p&&(a[i].p=='R'||a[i].p=='P')){ans+=(a[i].x-a[i-1].x);}
        else if(a[i].p=='P'&&a[i-1].p=='R'){ans+=(a[i].x-a[i-1].x);}
        else if(a[i].p=='R'&&a[i-1].p=='P'){ans+=(a[i].x-a[i-1].x);}
    }
    for(int i=1;i<n;i++){
        if(a[i].p==a[i-1].p&&a[i].p=='B'){ans+=(a[i].x-a[i-1].x);}
        else if(a[i].p=='P'&&a[i-1].p=='B'){ans+=(a[i].x-a[i-1].x);}
        else if(a[i].p=='B'&&a[i-1].p=='P'){ans+=(a[i].x-a[i-1].x);}
    }
    cout<<ans<<endl;
}

没有考虑有敌国拦在中间的情况,真是该打!


写了老半天,还是wa了,但是我的代码是没有问题的,是我把题目理解错了

#include<iostream>
#include<cstdio>
using namespace std;
struct node
{
    int x;
    char p;
}r[150000],b[150000],s[150000];
int main()
{
    int n;

    int tr,tb;cin>>n;
    //cout<<"n="<<n<<endl;
    tr=tb=0;
    for(int i=0;i<n;i++){
        //cout<<i<<endl;
        scanf("%d %c",&s[i].x,&s[i].p);
        if(s[i].p=='R'){r[tr++]=s[i];}
        else if(s[i].p=='B'){b[tb++]=s[i];}
        else if(s[i].p=='P'){r[tr++]=s[i];b[tb++]=s[i];}
    }
    unsigned long long ans;
    ans=0;
    for(int i=1;i<tr;i++){
        ans+=(r[i].x-r[i-1].x);
    }
    for(int i=1;i<tb;i++){
        ans+=(b[i].x-b[i-1].x);
    }
    for(int i=1;i<n;i++){
        if(s[i].p==s[i-1].p&&s[i].p=='P'){
            ans-=(s[i].x-s[i-1].x);
        }
    }
    cout<<ans<<endl;


}