CF1131B 题解

题目传送门

好水的绿题,当放松了。

题目分析

为了方便表述,定义 \(lsta,lstb,nowa,nowb\),分别表示上次双方的得分以及当前的得分。

考虑分讨,若 \(lsta=lstb\),贡献即 \(\min(nowa,nowb)-lsta\)

上次得分不同的情况有 \(2\) 种,但本质上是一样的,因此我们假设 \(lsta<lstb\)

显然平局只会在落后方当前得分追上了领先方的上次得分时才会发生,在此条件下,贡献为 \(\min(nowa,nowb)-lstb+1\)

贴上代码

#include<bits/stdc++.h>
#define debug puts("Shiina_Mashiro_kawaii")
#define ok printf("%d\n",ans2)
#define no puts("-1")
// #define int long long
using namespace std;
int read(){
	int x=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=x*10+c-48;
		c=getchar();
	}
	return x*f;
}
const int maxn=10010;
int n;
int ans;
int flag;
int a[maxn],b[maxn];
inline void init(){
	n=read();ans=1;
	for(register int i=1;i<=n;++i){
		a[i]=read();b[i]=read();
	}
	ans+=min(a[1],b[1]);
}
int main(){
	init();
	for(register int i=2;i<=n;++i){
		if(a[i-1]<b[i-1]) flag=1;
		else if(a[i-1]>b[i-1]) flag=2;
		else flag=3;
		int minn=min(a[i],b[i]);
		if(flag==1){
			if(a[i]>=b[i-1]) ans+=minn-b[i-1]+1;
		}
		else if(flag==2){
			if(a[i-1]<=b[i]) ans+=minn-a[i-1]+1;
		}
		else ans+=minn-a[i-1];
	}
	printf("%d",ans);
}
posted @ 2023-02-24 17:13  yizhixiaoyun  阅读(36)  评论(0)    收藏  举报