Codeforces Good Bye 2017 908F F. New Year and Rainbow Roads

  OvO http://codeforces.com/contest/908/problem/F

  CF 908F

  需要注意细节的模拟题。

  如果三种颜色都存在,则记每两个相邻的G组成一个段,对每个段进行讨论。

  如果三种颜色中缺了某种或某些颜色,则特殊地进行讨论。

  如果是像 BRB 这组数据 如果把第一个B和第三个B连起来,那么中间的R也和这两个B相连了

#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <algorithm>

using namespace std;

typedef long long ll;

const int M=3e5+44;
const int INF=1e9+44;

struct Node
{
	int plc,tp;
} node[M];

int n;

void solve()
{
	ll ans=0;
	int big1,big2,sum1,sum2,lst0,lst1,lst2,tmp;
	lst0=lst1=lst2=-1;
	sum1=sum2=0; big1=big2=-1;
	for(int i=1;i<=n;i++)
	{
		if(node[i].tp==0)
		{
			if(lst1!=-1)
				sum1+=node[i].plc-lst1,big1=max(big1,node[i].plc-lst1);
			if(lst2!=-1)
				sum2+=node[i].plc-lst2,big2=max(big2,node[i].plc-lst2);
			if(lst0==-1) ans+=sum1,ans+=sum2;
			else
			{
				ans+=sum1,ans+=sum2,ans+=node[i].plc-lst0;
				if(big1==-1) big1=0;
				if(big2==-1) big2=0; 
				tmp=big1+big2;
				if(big1!=0 && big2!=0)
					tmp=max(tmp,node[i].plc-lst0);
//				cout<<ans<<' '<<tmp<<' '<<big1<<' '<<big2<<' '<<sum1<<' '<<sum2<<endl;
				ans-=tmp;
			}
			lst1=lst2=-1;
			sum1=sum2=0; big1=big2=-1;
			lst0=node[i].plc;
		}
		else if(node[i].tp==1)
		{
			if(lst1==-1)
			{
				if(lst0==-1)
					sum1+=0;
				else
					sum1+=node[i].plc-lst0,big1=max(big1,node[i].plc-lst0);
			}
			else
				sum1+=node[i].plc-lst1,big1=max(big1,node[i].plc-lst1);
			lst1=node[i].plc;
		}
		else
		{
			if(lst2==-1)
			{
				if(lst0==-1)
					sum2+=0;
				else
					sum2+=node[i].plc-lst0,big2=max(big2,node[i].plc-lst0);
			}
			else
				sum2+=node[i].plc-lst2,big2=max(big2,node[i].plc-lst2);
			lst2=node[i].plc;
		}
	}
	ans+=sum1,ans+=sum2;
	printf("%I64d",ans);
}

int main()
{
	int cnt[3],lst[3],cst[3];
	char chr[3];
	scanf("%d",&n);
	memset(cst,0,sizeof(cst));
	memset(lst,-1,sizeof(lst));
	memset(cnt,0,sizeof(cnt));
	for(int i=1;i<=n;i++)
	{
		scanf("%d%s",&node[i].plc,chr);
		if(chr[0]=='G')
		{
			node[i].tp=0;
			cnt[0]++;
			if(lst[0]!=-1) cst[0]+=node[i].plc-lst[0];
			lst[0]=node[i].plc;
		}
		else if(chr[0]=='B')
		{
			node[i].tp=1;
			cnt[1]++;
			if(lst[1]!=-1) cst[1]+=node[i].plc-lst[1];
			lst[1]=node[i].plc;		
		}
		else 
		{
			node[i].tp=2;
			cnt[2]++;
			if(lst[2]!=-1) cst[2]+=node[i].plc-lst[2];
			lst[2]=node[i].plc;		
		}
	}
	if(cnt[0]!=0 && cnt[1]==0 && cnt[2]==0)
	{
		printf("%d",cst[0]);
		return 0;
	}
	if(cnt[0]==0)
	{
		if(cnt[1]==0 || cnt[2]==0)
		{
			printf("%d",cst[1]+cst[2]);
			return 0;
		}
		int mn=INF,flag12,flag21;
		ll ans=0;
		flag12=flag21=0;
		for(int i=1;i<n;i++)
		{
			if(node[i].tp!=node[i+1].tp && (node[i+1].plc-node[i].plc<mn))
				mn=node[i+1].plc-node[i].plc;
			if(node[i].tp==1 && node[i+1].tp==2)
				flag12=1;
			if(node[i].tp==2 && node[i+1].tp==1)
				flag21=1;
		}
		if(flag12 && flag21)
			mn=0;
		ans=0ll+cst[1]+cst[2]+mn;
		printf("%I64d",ans);
		return 0;	
	}
	solve();
	return 0;
}

/*

6
1 R
5 B
9 R
10 B
14 R
15 B

*/

  

原文地址:https://www.cnblogs.com/FxxL/p/8185720.html