【比赛记录】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;
}

浙公网安备 33010602011771号