UNIQUE VISION Programming Contest 2024 Summer (AtCoder Beginner Contest 359)
A - Count Takahashi
数 Takahashi 字符串的数量。
模拟。
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=2e5+3;
char s[maxn];
int n,cnt;
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>s;
cnt+=s[0]=='T';
}
cout<<cnt;
return 0;
}
B - Couples
给 \(2N\) 个数,求两个相等的数之间恰好夹着一个数的对数。
模拟。
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=2e5+3;
int a[maxn];
int n,cnt;
signed main(){
cin>>n;
for(int i=1;i<=2*n;i++){
cin>>a[i];
}
for(int i=1;i<=2*n-2;i++){
if(a[i]==a[i+2]) cnt++;
}
cout<<cnt;
return 0;
}
C - Tile Distance 2
给一个平面直角坐标系,经过蓝线要付钱,求从 \((s_x+0.5,s_y+0.5)\) 到 \((t_x+0.5,t_y+0.5)\) 的最小花费。
考虑把平面直角坐标系换成六边形坐标系,就会发现,对于一个蓝色围成的区域,他到其相邻的
区域的花费为 \(1\)。
于是最短路为 \(\max\{|s_x-t_y|,\frac{|s_x-t_x|+|s_y-t_y|}{2}\}\)
注意处理坐标细节。
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=2e5+3;
// int a[maxn];
int n,sx,sy,tx,ty,cnt;
signed main(){
cin>>sx>>sy>>tx>>ty;
if((sx+sy)%2==1) sx--;
if((tx+ty)%2==1) tx--;
int disy=abs(sy-ty),disx=abs(sx-tx);
cout<<(max(disx,disy)+disy)/2;
return 0;
}
E - Water Tank
给定一个长度为 \(N\) : \(H=(H _ 1,H _ 2,\dotsc,H _ N)\) 的正整数序列。
存在一个长度为 \(N+1\) : \(A=(A _ 0,A _ 1,\dotsc,A _ N)\) 的非负整数序列。最初, \(A _ 0=A _ 1=\dotsb=A _ N=0\) 。
在 \(A\) 上重复执行如下操作:
- 将 \(A _ 0\) 的值增加 \(1\) 。
- 对于这个顺序的 \(i=1,2,\ldots,N\) ,执行如下操作:
—如果 \(A _ {i-1}\gt A _ i\) 和 \(A _ {i-1}\gt H _ i\) ,则将 \(A _ {i-1}\) 的值减少1,将 \(A _ i\) 的值增加 \(1\) 。
对于每个 \(i=1,2,\ldots,N\) ,求在 \(A _ i\not =0\) 第一次成立之前的操作次数。
其实就是遵循物理规律倒水。
用单调栈维护 \(p_i\) 表示 \(i\) 之前第一个比 \(i\) 高的位置。
设 \(i\) 之前全部倒满时间需要 \(f_i\),则有转移
\[f_i=f_{p_i}+h_i(i-p_i)
\]
时间复杂度 \(O(n)\)。
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=2e5+3;
int h[maxn],a[maxn];
int n;
int stk[maxn],f[maxn],top;
signed main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>h[i];
for(int i=n;i;i--){
while(top&&h[i]>h[stk[top]])
f[stk[top]]=i,top--;
stk[++top]=i;
}
f[1]=1; a[1]=h[1];
for(int i=2;i<=n+1;i++){
a[i]=a[f[i]]+(i-f[i])*h[i];
}
for(int i=1;i<=n;i++) cout<<a[i]+1<<' ';
return 0;
}