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\) 上重复执行如下操作:

  1. \(A _ 0\) 的值增加 \(1\)
  2. 对于这个顺序的 \(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;
}
posted @ 2024-06-24 21:31  view3937  阅读(13)  评论(0编辑  收藏  举报
Title