首页 > 其他分享 >Atcoder Beginner Contest 379 (A-F)

Atcoder Beginner Contest 379 (A-F)

时间:2024-11-14 19:43:10浏览次数:1  
标签:Showball Atcoder Beginner int cin long 379 -- using

Atcoder Beginner Contest 379 (A-F)

题目链接

A - Cyclic

#include<bits/stdc++.h>

using namespace std;

using i64=long long;

void Showball(){
    char a,b,c;
    cin>>a>>b>>c;
    cout<<b<<c<<a<<" "<<c<<a<<b<<"\n"; 
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t=1;
    //cin>>t;

    while(t--){
      Showball();
    }

    return 0;
}

B - Strawberries

#include<bits/stdc++.h>

using namespace std;

using i64=long long;

void Showball(){
    int n,k;
    cin>>n>>k;
    string s;
    cin>>s;
    int ans=0;
    for(int i=0,j=0;i<n;){
        while(j<n&&s[j]==s[i]) j++;
        if(s[i]=='O') ans+=(j-i)/k;
        i=j; 
    } 
    cout<<ans<<"\n";
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t=1;
    //cin>>t;

    while(t--){
      Showball();
    }

    return 0;
}

C - Sowing Stones

对比其余 \(C\) 题,算是有点难度的。首先如果棋子之和不等于 \(n\) ,或者最小的 \(x_i\) 不为 \(1\) ,那么无解。

因为每个棋子只能往后移动,因此我们直接贪心往后放即可。相邻的 \(x_i\) 之间的都需要移动,发现贡献是一个等差数列。

直接求即可。如果数量不够,说明无解。多的棋子直接给下一个 \(x_i\) ,注意这部分也要算贡献。最后判断一下棋子有没有剩余即可。

#include<bits/stdc++.h>

using namespace std;

using i64=long long;

void Showball(){
    int n,m;
    cin>>n>>m;
    vector<pair<int,int>> a(m+1);
    for(int i=0;i<m;i++) cin>>a[i].first;
    i64 sum=0;    
    for(int i=0;i<m;i++) {
        int x;
        cin>>x;
        sum+=x;
        a[i].second=x;
    }
    a[m].first=n+1;
    sort(a.begin(),a.end());
    if(sum!=n||a[0].first!=1) return cout<<"-1\n",void();

    i64 ans=0;
    for(int i=0;i<m;i++){
        a[i].second--;
        int d=a[i+1].first-a[i].first-1;
        if(a[i].second<d) return cout<<"-1\n",void();
        ans+=1LL*d*(d+1)/2;
        if(a[i].second>d){
            a[i+1].second+=(a[i].second-d);
            ans+=1LL*(a[i].second-d)*(a[i+1].first-a[i].first);
        }
    }
    if(a[m].second) ans=-1;
    cout<<ans<<"\n";
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t=1;
    //cin>>t;

    while(t--){
      Showball();
    }

    return 0;
}

D - Home Garden 思维

因为只有全局加操作,因此我们可以使用类似懒标记的思想,将所有的加操作加到标记上,那么插入一个新花盆的时候,我们可以赋初值为 \(-sum\) 。然后维护好单调性,有多少个大于 \(h\) 我们直接二分即可。

#include<bits/stdc++.h>

using namespace std;

using i64=long long;

void Showball(){
    int q;
    cin>>q;
    int hh=q,tt=q;
    vector<i64> a(q);

    i64 sum=0;
    while(q--){
        int op;
        cin>>op;
        if(op==1){
            a[--hh]=-sum;
        }else if(op==2){
            int t;
            cin>>t;
            sum+=t;
        }else{
            int h;
            cin>>h;
            int p=lower_bound(a.begin()+hh,a.begin()+tt,h-sum)-(a.begin()+hh);
            cout<<tt-hh-p<<"\n";
            tt=hh+p;
        }
    }
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t=1;
    //cin>>t;

    while(t--){
      Showball();
    }

    return 0;
}

E - Sum of All Substrings

经典的拆分算贡献的题目,我们发现每一位数字的贡献为 \(i\times a_i \times(10^0+10^1+...+10^{n-i})\)。

等差数列求和即可。但是本题数据范围很大,要用高精度,复杂难写。我们可以用数组存取每一位的系数,

那么每次操作,就相当于区间加上一个系数,用差分解决即可。最后模拟处理一下进位即可。

#include<bits/stdc++.h>

using namespace std;

using i64=long long;

void Showball(){
    int n;
    cin>>n;
    string s;
    cin>>s;
    s="?"+s;
    vector<i64> a(500010);
    for(int i=1;i<=n;i++){
        int x=n-i+1,y=i*(s[i]-'0');
        a[1]+=y;a[x+1]-=y;
    }

    for(int i=1;i<=n;i++) a[i]+=a[i-1];

    i64 k=0;
    for(int i=1;i<=n;i++){
        a[i]+=k;
        k=a[i]/10;
        a[i]%=10;
    }
    int cnt=n;
    while(k){
        a[++cnt]=k%10;
        k/=10;
    }

    for(int i=cnt;i;i--) cout<<a[i];
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t=1;
    //cin>>t;

    while(t--){
      Showball();
    }

    return 0;
}

F - Buildings 2

首先我们可以知道:\(l\) 能够看到的建筑物 \(r\) 一定能够看到, \(r\) 能够看到的建筑物 \(l\) 不一定能够看到。

因此想要找 \(l,r\) 都能够看到的建筑物,只需要去找 \(l\) 能够看到的建筑物中位置在 \(r\) 右边的即可。

考虑离线,将询问按照左端点进行分类。每个位置能够看到的建筑物,我们可以倒着维护一个单调队列。

然后在这个单调队列上进行二分即可。

#include<bits/stdc++.h>

using namespace std;

using i64=long long;

void Showball(){
    int n,q;
    cin>>n>>q;
    vector<int> h(n+1);
    vector<array<int,2>> Q[n+1];
    for(int i=1;i<=n;i++) cin>>h[i];
    for(int i=1;i<=q;i++){
        int l,r;
        cin>>l>>r;
        Q[l].push_back({r,i});
    }  

    vector<int> st(n+1),ans(q+1);
    int cnt=0;
    for(int i=n;i;i--){
        for(auto [j,id]:Q[i]){
            int l=1,r=cnt;
            while(l<r){
                int mid=l+r+1>>1;
                if(st[mid]>j) l=mid;
                else r=mid-1;
            }
            if(st[l]<=j) ans[id]=0;
            else ans[id]=l;
        }
        while(cnt&&h[st[cnt]]<h[i]) cnt--;
        st[++cnt]=i;
    }

    for(int i=1;i<=q;i++) cout<<ans[i]<<"\n";
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t=1;
    //cin>>t;

    while(t--){
      Showball();
    }

    return 0;
}

标签:Showball,Atcoder,Beginner,int,cin,long,379,--,using
From: https://www.cnblogs.com/showball/p/18546646

相关文章

  • AtCoder Beginner Contest 353 - VP 记录
    Preface这次比赛蛮简单的,就是黄题有点多,少了区分度。而且SigmaProblemAnotherSigmaProblemYetAnotherSigmaProblem是什么奇妙的题目名称?SigmaProblemAnotherSigmaProblemYetAnotherSigmaProblem\(\texttt{\scriptsizeYet\footnotesizeA......
  • AtCoder 板刷记录
    话说为啥这些场都没有G题的说[ABC200F]MinflipSummation显然的策略是把全部都是一个数的段变成全不都是另一个数,然后考虑进行dp设一个dp[i][0/1][0/1]表示一下前i个字符中奇偶性为j填的数是k时j的总和然后直接做就行了,需要矩阵快速幂加速一下[ABC201F]Insert......
  • AtCoder Beginner Contest 378 题解
    AtCoderBeginnerContest378题解比赛链接A-Pairing贪心#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;voidShowball(){vector<int>a(5);for(inti=0;i<4;i++){intx;cin>>x;a[x]++;......
  • ABC379
    Clink点击查看代码#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;intn,m;structnd{ intx,a;}y[200005];intqzh;intans;boolcmp(ndl,ndr){ returnl.x<r.x;}signedmain(){ cin>>n>>m; for(inti......
  • AtCoder Beginner Contest 356 - VP记录
    A-SubsegmentReverse点击查看代码#include<cstdio>#include<numeric>#include<algorithm>usingnamespacestd;constintN=105;intn,a[N],l,r;intmain(){ scanf("%d%d%d",&n,&l,&r); iota(a+1,a+n+1,1); reverse(a+l,......
  • AtCoder Beginner Contest 379
    这次又是倒在了t5,没救了。ABC379A-Cyclic难度:红#include<bits/stdc++.h>usingnamespacestd;intmain(){chara,b,c;cin>>a>>b>>c;cout<<b<<c<<a<<''<<c<<a<<b;return0;}B-......
  • ABC372D ABC379F 题解 单调栈二分
    ABC372DABC379F题解单调栈二分一直觉得AT上面学到的东西比CF要多一些,无意捧一踩一,但可能是我太菜的原因,毕竟ABC的题目普遍要比Div.2简单一些。好多次碰到这个单调栈里面二分的trick了,所以写一篇来总结一下。ABC372D形象地给定一系列Buildings的高度\(h\),保证每个......
  • ABC 379(E-F)
    ABC379E伪装高精的找规律题#include<bits/stdc++.h>usingnamespacestd;#definelllonglong#defineintlonglong#definepiipair<int,int>#definemkpmake_pairusingnamespacestd;constintN=3e5+5;intpre[N],ans[N];signedmain(){io......
  • C - Sowing Stones(python解)-atcoder
    C-SowingStones**(python解)-atcoder原题链接:C-SowingStones问题分析:每个包含石头的单元格X[i]中有A[i]个石头。我们需要确保每个单元格从1到N最终都有1个石头。思路:可用的石头总数必须等于单元格的总数。即需要N个石头,但只有ΣA[i](其中A[i]是单元格......
  • ABC379E 题解
    ABC379E题解一道很好的题,开始还以为是高精度来着,但是发现不必要也不能用高精度,而是用一种技巧代替。题意Youaregivenastring\(S\)oflength\(N\)consistingofdigitsfrom1through9.Foreachpairofintegers\((i,j)\(1\leqi\leqj\leqN)\),define\(f(......