AtCoder Beginner Contest 381

zhouruoheng發表於2024-11-22

AtCoder Beginner Contest 381 總結

https://atcoder.jp/contests/abc381

罰時吃爽了 qwq。

A

按題意模擬,判斷一下即可。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <map>

using namespace std;
typedef long long ll;
const int N=105;
int n;
string s;

void solve()
{
    cin>>n>>s;
    bool st=1;
    if(n%2==0) st=0;
    for(int i=1;i<=(n+1)/2-1;i++) if(s[i-1]!='1') st=0;
    if(s[(n+1)/2-1]!='/') st=0;
    for(int i=(n+1)/2+1;i<=n;i++) if(s[i-1]!='2') st=0;
    if(st) cout<<"Yes\n";
    else cout<<"No\n";
}
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("1.in","r",stdin);
    freopen("1.out","w",stdout);
    #endif 
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    solve();
    return 0;
}

B

同樣是按照題意判斷。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <map>

using namespace std;
typedef long long ll;
const int N=105;
int n;
string s;
map<char,int> H;
void solve()
{
    cin>>s;
    n=s.size();
    bool st=1;
    if(n%2==1) st=0;
    for(int i=1;i<=n/2;i++) if(s[2*i-1]!=s[2*i-1-1]) st=0;
    for(int i=0;i<n;i++) H[s[i]]++;
    for(int i=0;i<n;i++) if(H[s[i]]!=2) st=0;
    if(st) cout<<"Yes\n";
    else cout<<"No\n";
}
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("1.in","r",stdin);
    freopen("1.out","w",stdout);
    #endif 
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    solve();
    return 0;
}

C

找到所有 / 的位置,向兩邊擴充,左邊是 1,右邊是 2

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <map>

using namespace std;
typedef long long ll;
const int N=2e5+5;
int n;
string s;
map<char,int> H;
void solve()
{
    cin>>n>>s;
    s="0"+s;
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        if(s[i]=='/')
        {
            int k=0;
            while(i-k-1>=1&&i+k+1<=n&&s[i-k-1]=='1'&&s[i+k+1]=='2') k++;
            ans=max(ans,1+2*k);
        }
    }
    cout<<ans<<"\n";
}
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("1.in","r",stdin);
    freopen("1.out","w",stdout);
    #endif 
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    solve();
    return 0;
}

D

將陣列 \(a\) 變成元素加個數的形式,元素陣列為 \(b\),個數為 \(c\),如 \(\mathtt{1,1,2,2,3,3,3}\)\(b\) 就是 \(\mathtt{1,2,3}\)\(c\) 就是 \({2,2,3}\)。用雙指標來做。用 \(v\) 統計是否出現,\(j\) 表示左指標,\(i\) 表示右指標。統計答案就是 \(i-j+1\)

  • \(c_i=1\) 時,說明 \(i\) 不能貢獻,直接將 \(j\) 移動到 \(i+1\)
  • \(c_i>2\) 時,\(i\) 只能作為開頭或結尾,若 \(b_i\) 沒出現過,統計一次答案。然後將 \(j\) 移動到 \(i\),標記 \(b_i\) 出現。
  • \(c_i=2\) 時,若 \(b_i\) 出現過,則一直移動 \(j\) 直到 \(v_{b_i}=0\)。然後標記 \(b_i\) 出現。

移動 \(j\) 時要將 \(v_{b_j}\) 變為 \(0\)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <map>

using namespace std;
typedef long long ll;
const int N=2e5+5;
int n;
int a[N],b[N],c[N];
int v[N];
void solve()
{
    cin>>n;
    int tot=0;
    for(int i=1;i<=n;i++) 
    {
        cin>>a[i];
        if(a[i]!=a[i-1]) b[++tot]=a[i],c[tot]=1;
        else c[tot]++;
    }
    int j=1,ans=0;
    for(int i=1;i<=tot;i++)
    {
        if(c[i]<2) while(j<=i) v[b[j++]]=0;
        else if(c[i]>2) 
        {
			if(!v[b[i]]) ans=max(ans,(i-j+1)*2);
            while(j<i) v[b[j++]]=0;
            v[b[i]]=1;
        }
        else 
        {
            while(j<=i&&v[b[i]]) v[b[j++]]=0;
            v[b[i]]=1;
        }
        if(j<=i) ans=max(ans,(i-j+1)*2);
    }
    cout<<ans<<'\n';
}
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("1.in","r",stdin);
    freopen("2.out","w",stdout);
    #endif 
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    solve();
    return 0;
}

E

首先處理 12/ 的字首數量,並記錄所有 / 的位置。對於 \(l\)\(r\),找到位於


F

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <map>

using namespace std;
typedef long long ll;
const int N=2e5+5,M=20,S=1<<20;
int n;
int a[N],ne[N][M];
int f[S];
void solve()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=0;i<M;i++) ne[n][i]=ne[n+1][i]=n+1;
    for(int i=n-1;i>=0;i--)
    {
        for(int j=0;j<M;j++) ne[i][j]=ne[i+1][j];
        ne[i][a[i+1]-1]=i+1;
    }
    for(int i=0;i<S;i++) f[i]=n+1;
    f[0]=0;
    int ans=0;
    for(int i=0;i<S;i++)
    {
        int cnt=0;
        for(int j=0;j<M;j++)
        {
            if(i&(1<<j)) 
            {
                cnt+=2;
                f[i]=min(f[i],ne[ne[f[i^(1<<j)]][j]][j]);
            }
        }
        if(f[i]<=n) ans=max(ans,cnt);
    }
    cout<<ans<<'\n';
}
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("1.in","r",stdin);
    freopen("1.out","w",stdout);
    #endif 
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    solve();
    return 0;
}