Educational Codeforces Round 158 (Rated for Div. 2) - VP記錄

Jerrycyx發表於2024-11-11

A. Line Trip

油量必須支援車子透過所有加油站間的空間,還要注意開回來的時候終點不能加油。

點選檢視程式碼
#include<cstdio>
#include<algorithm>
using namespace std;

const int N=55;
int n,x,a[N];

int main()
{
	int T; scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d",&n,&x);
		int ans=0;
		for(int i=1;i<=n;i++)
		{
			scanf("%d",&a[i]);
			ans=max(ans,a[i]-a[i-1]);
		}
		ans=max(ans,(x-a[n])<<1);
		printf("%d\n",ans);
	}
	return 0;
}

B. Chip and Ribbon

每一對 \(a_{i-1}<a_i\) 都需要傳送到 \(a_i\) 至少 \((a_i-a_{i-1})\) 次,注意開頭不需要傳送。

點選檢視程式碼
#include<cstdio>
#include<algorithm>
using namespace std;

const int N=2e5+5;
int n,a[N];

int main()
{
	int T; scanf("%d",&T);
	while(T--)
	{
		scanf("%d",&n);
		long long ans=0;
		for(int i=1;i<=n;i++)
		{
			scanf("%d",&a[i]);
			ans+=max(a[i]-a[i-1],0);
		}
		printf("%lld\n",ans-1);
	}
	return 0;
}

C. Add, Divide and Floor

我的洛谷題解

D. Yet Another Monster Fight

我的洛谷題解

E. Compressed Tree

樹上 DP,但是統計答案的時候是每一個點都可以是根的。

參考題解

#include<cstdio>
#include<vector>
#include<algorithm>
#include<functional>
using namespace std;

const int N=5e5+5;
const long long INF=1e18;
int n,a[N];

struct Allan{
	int to,nxt;
}edge[N<<1];
int head[N],idx;
inline void add(int x,int y)
{
	edge[++idx]={y,head[x]};
	head[x]=idx;
	return;
}

long long f[N],ans;
void DFS(int x,int fa=0)
{
	vector<long long> son;
	f[x]=a[x];
	ans=max(ans,(long long)a[x]);
	for(int i=head[x];i;i=edge[i].nxt)
	{
		int y=edge[i].to;
		if(y==fa) continue;
		DFS(y,x);
		son.push_back(f[y]);
		ans=max(ans,a[x]+f[y]);
		f[x]=max(f[x],f[y]);
	}
	sort(son.begin(),son.end(),greater<long long>());
	if(son.size()>1)
	{
		long long sum=son[0]+son[1];
		ans=max(ans,sum);
		for(int i=2;i<(int)son.size();i++)
			if(son[i]>0) sum+=son[i];
		f[x]=max(f[x],a[x]+sum);
	}
	if(son.size()>2)
	{
		long long sum=son[0]+son[1]+son[2];
		for(int i=3;i<(int)son.size();i++)
			if(son[i]>0) sum+=son[i];
		ans=max(ans,a[x]+sum);
	}
	return;
}

int main()
{
	int T; scanf("%d",&T);
	while(T--)
	{
		scanf("%d",&n);
		for(int i=1;i<=n;i++)
			scanf("%d",&a[i]);
		for(int i=1;i<n;i++)
		{
			int x,y; scanf("%d%d",&x,&y);
			add(x,y),add(y,x);
		}
		DFS(1);
		printf("%lld\n",ans);
		
		for(int i=1;i<=n;i++)
			head[i]=f[i]=a[i]=0;
		idx=ans=0;
	}
	return 0;
}

相關文章