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

AtCoder Beginner Contest 371

时间:2024-09-14 22:25:41浏览次数:1  
标签:AtCoder code Beginner int 用时 cin tot 371 include

ABC371总结

AtCoder Beginner Contest 371

一些废话

想着以后换一种方式写总结,不再以那种题解形式,写起来又累又难写,只对其中部分有意思的题目写出完整的题解。就是以随笔的形式,在打完比赛后写出自己的一些感悟,每道题做的过程中的一些思路、用时和需要改进的地方,就是类似随笔之类的,随便写写。

A

用时:8分37秒

很基础的语法题,可是我当场降智,正解应该是判断 \(a,b,c\),中是否满足第二大,我竟然直接对其大小情况进行枚举然后判断是否合法再输出第二大,硬是搞了 \(8\) 分钟

赛时code

#include <bits/stdc++.h>
using namespace std;


int main ()
{
    char a,b,c;
    int x,y,z;
    cin>>a>>b>>c;
    for(int x=1;x<=3;x++)
        for(int y=1;y<=3;y++)
            for(int z=1;z<=3;z++) 
            {
                if(x!=y&&y!=z&&x!=z)
                {
                    if(a=='<') if(x>y) continue;
                    if(a=='>') if(x<y) continue;
                    if(b=='<') if(x>z) continue;
                    if(b=='>') if(x<z) continue;
                    if(c=='<') if(y>z) continue;
                    if(c=='>') if(y<z) continue;
                    if(x==2) cout<<'A'<<"\n";
                    if(y==2) cout<<'B'<<"\n";
                    if(z==2) cout<<'C'<<"\n";
                    return 0;
                }
            }
    return 0;
}

code


B

这就没啥好说的了,记录下长子是谁,判断一下就好了。

用时:4分57秒

code

#include <bits/stdc++.h>
using namespace std;

const int N=105;
int n,m;
int st[N];
int ans[N];

int main ()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int id;
        char c;
        cin>>id>>c;
        st[i]=id;
        if(c=='F') continue;
        if(ans[id]==0) ans[id]=i;
    }
    for(int i=1;i<=m;i++) 
    {
        if(ans[st[i]]==i)  cout<<"Yes\n";
        else cout<<"No\n";
    }
    return 0;
}

C

用时:22分03秒

一开始是没想出来的,后面写完 \(D\) 回来看到数据范围,\(n\) 特别小,就想到枚举 \(p\) 的全排列,再进行统计。双向的问题还搞了我一会。

code

#include <bits/stdc++.h>
using namespace std;
const int N=10;
int n;
int m1,m2;
int p[N];
int g[N][N],h[N][N],a[N][N];
int ans=0x3f3f3f3f;
int main ()
{
    cin>>n;
    cin>>m1;
    for(int i=1;i<=m1;i++)
    {
        int x,y;
        cin>>x>>y;
        g[x][y]=g[y][x]=1;
    }
    cin>>m2;
    for(int i=1;i<=m2;i++)
    {
        int x,y;
        cin>>x>>y;
        h[x][y]=h[y][x]=1;
    }
    for(int i=1;i<=n;i++)
        for(int j=i+1;j<=n;j++)
            cin>>a[i][j],a[j][i]=a[i][j];
    for(int i=1;i<=n;i++) p[i]=i;
    do
    {
        int cnt=0;
        for(int i=1;i<=n;i++)
            for(int j=i+1;j<=n;j++)
            {
                int x=p[i],y=p[j];
                if(g[i][j]!=h[x][y]) cnt+=a[x][y];
            }
        ans=min(ans,cnt);
        
    }while(next_permutation(p+1,p+n+1));
    cout<<ans<<"\n";
    return 0;
}

D

用时:20分18秒

没啥好说的,简单的离散化加前缀和。一开始我空间开小了,吃了一次罚时。

code

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+5;
int n,q;
int p[N];
int b[N*3];
int tot;
ll a[N],c[N];
int l[N],r[N];

int main ()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>p[i],b[++tot]=p[i];
    for(int i=1;i<=n;i++) cin>>a[i];
    cin>>q;
    for(int i=1;i<=q;i++)
    {
        cin>>l[i]>>r[i];
        b[++tot]=l[i];
        b[++tot]=r[i];
    }
    sort(b+1,b+tot+1);
    tot=unique(b+1,b+tot+1)-b-1;
    for(int i=1;i<=n;i++)
    {
        int id=lower_bound(b+1,b+tot+1,p[i])-b;
        c[id]=a[i];
    }
    for(int i=1;i<=tot;i++) c[i]+=c[i-1];
    for(int i=1;i<=q;i++)
    {
        int x=lower_bound(b+1,b+tot+1,l[i])-b;
        int y=lower_bound(b+1,b+tot+1,r[i])-b;
        cout<<c[y]-c[x-1]<<"\n";
    }
    return 0;
}

E

用时:35分51秒

也是一开始没有思路,瞪了十分钟 \(F\) 以后回来想,不能 \(n^2\),考虑前缀和思想。整体考虑 \(sum_i\) 表示以 \(i\) 作为左端点的所有子序列产生的贡献。从 \(sum_1\) 开始,依次考虑每次删去第一个数后 \(sum\) 如何变化。
考虑子序列 \([i,r]\),删去 \(i\) 后,什么情况下才能使该子序列不同元素的个数减一?
当然是当后面没有 \(a_i\) 的情况下。也就是说我们要找到最大的 \(r\) 使 \([i+1,r]\) 中没有 \(a_i\),比他小的子序列如果还有元素的话就都应该减一。
因此按元素记录下所有元素所出现的位置,每次找到下一个 \(a_i\) 出现的位置,再对 \(sum\) 进行更新。

code

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
int n;
int a[N],b[N],c[N];
vector<int> g[N];
int v[N];
ll ans,sum;
int main ()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++) 
    {
        g[a[i]].push_back(i);
        b[i]=b[i-1];
        if(c[a[i]]==0) b[i]++;
        c[a[i]]++;
        sum+=b[i];
    }
    for(int i=1;i<=n;i++) g[i].push_back(n+1);
    ans+=sum;
    for(int i=1;i<n;i++)
    {
        int id=g[a[i]][++v[a[i]]];
        sum-=(id-i);
        ans+=sum;
    }
    cout<<ans<<"\n";
    return 0;
}

剩下的就等补完题再写了。

标签:AtCoder,code,Beginner,int,用时,cin,tot,371,include
From: https://www.cnblogs.com/zhouruoheng/p/18414725

相关文章

  • AtCoder Beginner Contest 371
    https://atcoder.jp/contests/abc371C:暴力。思路是把1-8的点映射到全排列上面,然后把有的点去掉没的点加上取ans最小值。这题复杂度是\(8!\times7\times4\),暴力求全排列即可(第一次写暴力全排列思索了一会复杂度#include<bits/stdc++.h>usingnamespacestd;#definepiipai......
  • 题解 [ABC371G] Lexicographically Smallest Permutation(中文/English)
    本题解提供英文版,位于示例代码之后。Englishversionofthiseditorialisprovidedafterthesamplecode.官方题解竟然用Python来算高精度lcm,我来提供一个可以避免一切大整数运算的方法。考察\(u\getsP_u\)这张图的每个置换环。为了使答案字典序最小,显然需要从前往后......
  • Taro(ABC 371)
    #include<bits/stdc++.h>#defineendl'\n'#defineintllusingll=longlong;typedefunsignedlonglongull;usingnamespacestd;voidGordenGhost();signedmain(){#ifdefGordenfreopen("in.txt","rt",stdi......
  • AtCoder Beginner Contest 370 补题记录
    A-RaiseBothHands题意:给出Snuke举的左右手情况,如果只举左手,输出Yes,如果只举右手,输出No,否则输出Invalid思路:举左手:(l==1&&r==0)举右手:(l==1&&r==0)其他情况都是Invalidvoidsolve(){intl=read(),r=read();if(l==1&&r==0){......
  • AtCoder Beginner Contest 274 A~E 题解
    吐槽:这比赛名字为啥没有英文版。。。A-BattingAverage题目大意给定整数\(A,B\),输出\(\fracBA\),保留三位小数。\(1\leA\le10\)\(0\leB\leA\)分析签到题,使用printf或cout格式化输出即可。代码#include<cstdio>usingnamespacestd;intmain(){ inta,b; sc......
  • TOYOTA MOTOR CORPORATION Programming Contest 2023#1 (AtCoder Beginner Contest 29
    好久没写题解了,这就来水一篇。A-JobInterview题目大意给定一个长为\(N\)的字符串\(S\),由o、-、x组成。判断\(S\)是否符合下列条件:\(S\)中至少有一个o。\(S\)中没有x。\(1\leN\le100\)分析签到题。直接按题意模拟即可。代码#include<cstdio>usingn......
  • AtCoder Beginner Contest 318 G - Typical Path Problem 题解
    G-TypicalPathProblem题目大意给定一张\(N\)个点、\(M\)条边的简单无向图\(G\)和三个整数\(A,B,C\)。是否存在一条从顶点\(A\)到\(C\),且经过\(B\)的简单路径?数据范围:\(3\leN\le2\times10^5\)\(N-1\leM\le\min(\frac{N(N-1)}2,2\times10^5)\)\(1\leA......
  • UNIQUE VISION Programming Contest 2023 Christmas (AtCoder Beginner Contest 334)
    A-ChristmasPresent题目大意给定两个正整数\(B,G\)(\(1\leB,G\le1000\)且\(B\neG\)),判断哪个更大。分析模拟即可。代码#include<cstdio>usingnamespacestd;intmain(){ intb,g; scanf("%d%d",&b,&g); puts(b>g?"Bat":&qu......
  • AtCoder Beginner Contest 254 A~E 题解
    A-LastTwoDigits题目大意给定正整数\(N\),求\(N\)的后两位。\(100\leN\le999\)输入格式\(N\)输出格式输出\(N\)的后两位,注意输出可能有前导0。样例\(N\)输出\(254\)54\(101\)01分析题目已经规定\(N\)是三位数,因此无需使用整数输入,直接将输入看成......
  • AtCoder Beginner Contest 258 A~Ex 题解
    D-Trophy题目大意有一个游戏,由\(N\)个关卡组成。第\(i\)个关卡由一个数对\((A_i,B_i)\)组成。要通过一个关卡,你必须先花\(A_i\)的时间看一次介绍。然后,用\(B_i\)的时间打通这个关卡。若想多次通过同一个关卡,则第一次需要看介绍,后面无需再看(即如果想打通第\(i\)关\(N\)次,则所......