首页 > 其他分享 >AtCoder Beginner Contest 379

AtCoder Beginner Contest 379

时间:2024-11-10 20:47:35浏览次数:4  
标签:AtCoder Beginner int ll cin long 379 mxn define

这次又是倒在了t5,没救了。

ABC379

A - Cyclic

难度:红


#include<bits/stdc++.h>
using namespace std;
int main(){
    char a,b,c;cin>>a>>b>>c;
    cout<<b<<c<<a<<' '<<c<<a<<b;
    return 0;
}

B - Strawberries

难度:红


#include<bits/stdc++.h>
using namespace std;
int main(){
    int k,n,cnt=0,ans=0;
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        char c;cin>>c;
        if(c=='O')cnt++;
        else cnt=0;
        if(cnt>=k)cnt=0,ans++;
    }
    cout<<ans;
    return 0;
}

C - Sowing Stones

难度:橙
考的时候以为要__int128,其实是不用的。


#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define lit __int128
#define mxn 200010
#define mp make_pair
#define pll pair<ll,ll>
#define X first
#define Y second
lit sum=0;
ll now=1,n,m;
pll a[mxn];
lit ans=0;
void write(lit a){
    if(a<10){
        putchar('0'+a);return;
    }
    write(a/10);
    putchar('0'+(a%10));
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=m;i++)cin>>a[i].X;
    for(int i=1;i<=m;i++)cin>>a[i].Y,sum+=a[i].Y;
    sort(a+1,a+m+1);
    if(sum!=n||a[1].X!=1)cout<<"-1",exit(0);
    a[m+1]=mp(n+1,0);
    for(int i=1;i<=m;i++){
        ans+=(now-a[i].X+(now+a[i].Y-a[i].X-1))*(a[i].Y)/2;
        now=now+a[i].Y;
        if(now<a[i+1].X||now>n+1)cout<<"-1",exit(0);
    }
    write(ans);
    return 0;
}

D - Home Garden

难度:橙-黄


#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mxn 200010
ll q,a[mxn],head=200000,tail=200000,lazy;
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>q;
    while(q--){
        int opt;cin>>opt;
        if(opt==1)a[--head]=-lazy;//插入
        else if(opt==2){//全局加
            ll t;cin>>t,lazy+=t;
        }
        else{
            ll h;cin>>h;
            ll pos=lower_bound(a+head,a+tail,h-lazy)-(a+head);
            cout<<tail-head-pos<<'\n',tail=head+pos;//查找并删除
        } 
    }
    return 0;
}

E - Sum of All Substrings

难度:黄
对于答案的每一位判贡献即可。


#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mxn 200010
ll n;char s[mxn];
ll num[mxn<<3],len,sum,ten[20];
int main(){
    scanf("%lld",&n);getchar();
    for(int i=1;i<=n;i++){
        scanf("%c",s+i);
        sum+=i*(s[i]-'0');
    }
    ten[0]=1;
    for(ll i=1;i<=9;i++)ten[i]=ten[i-1]*10;
    for(ll i=n;i;i--){
        num[(n-i)/8+1]+=sum*ten[(n-i)%8];
        for(ll j=(n-i)/8+1;;j++){
            if(num[j]>=ten[8]){
                num[j+1]+=num[j]/ten[8];
                num[j]%=ten[8];
            }
            else{
                len=max(len,j);
                break;
            }
        }
        sum-=i*(s[i]-'0');
    }
    for(int i=len;i;i--){
        if(i==len)printf("%lld",num[i]);
        else printf("%08lld",num[i]);
    }
    return 0;
}

F - Buildings 2

难度:黄-绿
离线处理询问。
可以用单调栈之类的东西维护最长上升子序列。


#include<bits/stdc++.h>
using namespace std;
#define mxn 200005
#define ll long long
#define pb push_back
vector<int> ask[mxn];
int n,m,a[mxn],askr[mxn],ans[mxn];
int q[mxn],tail,head;
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n>>m;
    tail=head=mxn-5;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=m;i++){
        int l;cin>>l>>askr[i];
        ask[l].pb(i);
    }
    for(int i=n;i;i--){ 
        for(int id:ask[i])ans[id]=(head-tail)-(lower_bound(q+tail,q+head,askr[id]+1)-(q+tail));
        while(tail<head&&a[q[tail]]<a[i])tail++; 
        q[--tail]=i;
    }
    for(int i=1;i<=m;i++)
        cout<<ans[i]<<'\n';
    return 0;
}

G - Count Grid 3-coloring

难度:蓝
对于每一位,我们设计 \(4\) 种状态:值为 \(1,2,3,\) 未知。对于每一位的取值至于上一行以及这一行确定的部分有关,考虑 \(\min(n,m)\leq20\),直接暴力转移即可。时间复杂度 \(\mathcal O(2^{\min(n,m)}nm)\)。


#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 998244353
#define mp make_pair
#define pii pair<ll,ll>
#define mxn 210
ll n,m,l,r,k,ans;
char s[mxn][mxn];
map<ll,ll> f,g;
ll get(ll x,ll a){
    return (x>>(a*2-2))&3;
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            cin>>s[i][j];
    if(n<m){
        swap(n,m);
        for(ll i=1;i<=n;i++)
            for(int j=1;j<=min(i,m);j++)
                swap(s[i][j],s[j][i]);
    }
    //对于每个点有4种情况:0,1,2,未知(3)
    //所以初始为2^(m*2)位
    f[(1<<m*2)-1]=1;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            g.clear();
            for(pii p:f){//上一行以及这一行确定的部分
                ll X=p.first,Y=p.second;
                if(s[i][j]!='?')l=r=k=s[i][j]-'0'-1;
                else l=0,r=2;
                for(ll k=l;k<=r;k++){
                    if(k==get(X,j)||(j>1&&k==get(X,j-1)))continue;
                    //不能与上一行以及这一行的相邻部分相同
                    ll num=X^((get(X,j)^k)<<(j*2-2));
                    //枚举可能的情况进行转移
                    g[num]=(g[num]+Y)%mod;
                }
            }
            f=g;
        }
    }
    for(pii p:f)
        ans=(ans+p.second)%mod;
    cout<<ans;
}

标签:AtCoder,Beginner,int,ll,cin,long,379,mxn,define
From: https://www.cnblogs.com/nagato--yuki/p/18537707

相关文章

  • 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(......
  • 题解:[ABC379D] Home Garden
    [ABC379D]HomeGarden题意:开始有一个空集,有\(Q\)次操作,每次有标识数\(op\):若\(op\)为\(1\):为集合添加一个元素\(0\)。若\(op\)为\(2\):输入\(T\),为集合内所有元素增加\(T\)。若\(op\)为\(3\):输入\(H\),删除集合内不小于\(H\)的元素,并输出删除元素个数。......
  • 题解:AT_abc379_e [ABC379E] E - Sum of All Substrings
    很水的一道题。我们先把题目上各地的数字看成一个序列,然后考虑计算该序列分别会对答案的每一位产生多少贡献。具体的,我们从后往前考虑答案的每一位。通过简单推演可知,设你当前考虑到答案的第\(i\)个数字,那么原序列对这一位的贡献为\(\sum_{j=1}^{n-i+1}a_j\timesj\)。这个......
  • AtCoder Beginner Contest 379
    A-Cyclic题意输入\(3\)个连续字符\(a,b,c\),输出另外两种顺序。思路模拟。代码点击查看代码#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongtypedefpair<int,int>pii;constintmxn=1e6+5;voidsolve(){ chara,b,c; cin......
  • 题解:AT_abc379_d [ABC379D] Home Garden
    难度严格小于C题。你考虑每盆花被种植的时间一定单调不降,这启示我们去用二分。具体的,我们用一个数组\(a\)表示当前所有的花的种植时间,并记录一个当前时间\(t\)。对于每个1操作都在数组后面加上个元素\(t\),对于\(2\)操作让\(t\leftarrowt+T\)。对于操作3,能够摘取的......
  • Toyota Programming Contest 2024#11(AtCoder Beginner Contest 379)题解
    总体情况A-Cyclic题意给你一个三位整数\(N\),其中每个数字都是介于\(1\)和\(9\)之间的整数。设\(a\),\(b\),\(c\)分别是\(N\)的百位、十位和个位数。打印一个按此顺序排列\(b\),\(c\),\(a\)所组成的整数,以及一个按此顺序排列\(c\),\(a\),\(b\)所组成......
  • AT_abc379_g
    过于一眼的轮廓线dp。兼纪念abc首场无伤AK。首先我们可以经过缜密的计算的得到矩形的宽不超过\(14\)。然后现在你有\(4\)个数(边界视作\(0\))。不难想到\(4\)进制状压轮廓线dp。轮廓线dp状压dp的一种,轮廓线是分隔已处理部分与未处理部分的线。在本题中,轮廓线......