【比赛记录】20250225HYABC[004]

水题赛,结果唐完了。

比赛题目(ABC388)

?UPC
Heavy Snake
Various Kagamimochi
Coming of Age Celebration
Simultaneous Kagamimochi
Simultaneous Kagamimochi 2(赛后要求拓展)

题目描述

  • ?UPC
    很水的水题,用char读入然后按格式输出即可。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl "\n"
char c;
signed main()
{
	IOS
	cin>>c;
	cout<<c<<"UPC";
	return 0;
 } 
  • Heavy Snake
    数据比较小,$ O(n^2) $暴力即可。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl "\n"
const int N=110;
int n,d;
int t[N],l[N];
int ans[N];
int opt=0;
signed main()
{
	IOS
	cin>>n>>d;
	for(int i=1;i<=n;i++)
	{
		cin>>t[i]>>l[i];
		ans[i]=t[i]*l[i];
	}
	for(int i=1;i<=d;i++)
	{
		opt=0;
		for(int j=1;j<=n;j++)
		{
			ans[j]+=t[j];
			opt=max(ans[j],opt);
		}
		cout<<opt<<endl;
	}
	return 0;
 } 
  • Various Kagamimochi
    很奇怪为什么能翻译成“镜饼”这个奇奇怪怪的名词。
    这一题因为本身就排好序了,所以二分+乘法原理就可以AC这道题了。如果说优化的话应该是把相同的数集合在一起(不然可以不用乘法原理的)。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl "\n"
const int N=5e5+10;
int n;
int a[N];
int cnt[N];
int b[N];
inline int read()
{
	char c=getchar();
	int ret=0,w=1;
	while(c<'0'||c>'9')
	{
		if(c=='-')w=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9')
	{
		ret=ret*10+(c-'0');
		c=getchar();
	}
	return ret*w;
}
int m;
int s[N];
int ans=0;
signed main()
{
	n=read();
	for(int i=1;i<=n;i++)
	{
		a[i]=read();
		if(i>1&&a[i]==a[i-1])
			cnt[m]++;
		else
		{
			b[++m]=a[i];
			cnt[m]++;
		}
	}
	for(int i=1;i<=m;i++)
		s[i]=s[i-1]+cnt[i];
	for(int i=1;i<=m;i++)
	{
		int x=b[i]*2;
		int d=lower_bound(b+1,b+m+1,x)-b;
		if(d>m)break;
		ans+=cnt[i]*(s[m]-s[d-1]);
	}
	cout<<ans;
	return 0;
 } 
  • Coming of Age Celebration

赛时没有考虑清楚,这题是区间修改题,不妨用差分试试看。

但是这时候就有一个很明显的问题:每一次差分的计算是\(O(n)\)的,这就导致算法复杂度飙升。

仔细想想就可以发现:每次只会影响后面的区间,而前面的区间是不会影响的,所以动态计算差分即可。复杂度\(O(n)\)

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl "\n"
const int N=5e5+10;
int n;
int a[N];
int d[N];
signed main()
{
	IOS
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	for(int i=1;i<=n;i++)d[i]=a[i]-a[i-1];
	for(int i=1;i<=n;i++)
	{
		a[i]=d[i]+a[i-1];
		int ans=a[i]-n+i;
		d[i+1]++;
		if(ans<0)
		{
			d[i+a[i]+1]--;
			cout<<0<<" ";
		}
		else cout<<ans<<" ";
	}
	return 0;
}
posted @ 2025-03-01 09:32  CASCwty  阅读(14)  评论(0)    收藏  举报