E Byteland, Berland and Disputed Cities
題意:給你1,2,3,三種點,使其排列在x軸上,去掉點1後使其2,3點完全聯通,去掉點2後使其1,3點完全聯通,問最短需要多長。
思路:1和2兩個點不用連,連了也得去掉。
那麼如果只有一個3點,我們把3點看成1點,按順序連一遍即可,同樣2點也是如此。
如果有兩個3點,那麼第一個3點的最左面相同點挨着連即可,第二個3點的最右面也是如此,但是兩個3點的中間只有兩種連法,(1)從左面的3點出發連接中間的1點直到右面的3點+從左面的3點出發連接中間的2點直到右面的3點(2)兩個3點直接連接+(從左面的3點出發連接中間的1點直到右面的3點-從左面的3點出發連接中間的1點直到右面的3點中的最大差值)+(從左面的3點出發連接中間的2點直到右面的3點-從左面的3點出發連接中間的2點直到右面的3點中的最大差值)。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int inf=0x3f3f3f3f;
const int maxn=200005;
int n;
int br,bb,bp;
int main()
{
while(~scanf("%d",&n))
{
int index;
char c;
ll ans=0;
br=bb=bp=0;
int lr,lb,lp;
int maxr=0,maxb=0;
for(int i=0; i<n; i++)
{
scanf("%d %c",&index,&c);
//cout<<c<<endl;
if(c=='P'||c=='R')
{
if(br)
{
ans+=(index-lr);
maxr=max(maxr,index-lr);
}
lr=index;
br=1;
}
//printf("ans=%d\n",ans);
if(c=='P'||c=='B')
{
if(bb)
{
ans+=(index-lb);
maxb=max(maxb,index-lb);
}
lb=index;
bb=1;
}
//printf("ans=%d\n",ans);
if(c=='P')
{
if(bp)
{
ans+=min(0,index-lp-maxr-maxb);
}
maxr=0,maxb=0;
lp=index;
bp=1;
}
//printf("ans=%d\n",ans);
}
printf("%lld\n",ans);
}
return 0;
}