首页 > 其他分享 >AtCoder Beginner Contest 365 补题记录(A~E,G)

AtCoder Beginner Contest 365 补题记录(A~E,G)

时间:2024-08-03 22:18:14浏览次数:13  
标签:AtCoder log Beginner int cin long 员工 补题 sqrt

Perf 2000+,但是补不回来上场超低的 Rating/ll

A

#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
    int n;
    cin>>n;
    if(n%400==0)cout<<"366\n";
    else if(n%100==0)cout<<"365\n";
    else if(n%4==0)cout<<"366\n";
    else cout<<"365\n";
    return 0;
}

B

开个结构体排序即可。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1000100;
struct qwq{
    int x,id;
    bool operator<(const qwq&r)const{
        return x>r.x;
    }
}a[N];
signed main(){
    int n;cin>>n;
    for(int i=1;i<=n;++i)cin>>a[i].x,a[i].id=i;
    sort(a+1,a+n+1);
    cout<<a[2].id<<'\n';
    return 0;
}

C

简单题。二分答案 \(p\),那么补贴即为 \(\sum\limits_{i=1}^n\min(a_i,p)\),直接计算一下然后找到最大的满足条件的 \(p\) 即可。时间复杂度为 \(O(n\log n)\)。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1000100;
int a[N],n,m;
bool check(int p){
    __int128 re=0;
    for(int i=1;i<=n;++i)
        re+=min(p,a[i]);
    return re<=m;
}
signed main(){
    cin>>n>>m;
    for(int i=1;i<=n;++i)cin>>a[i];
    int s=0;
    for(int i=1;i<=n;++i)s+=a[i];
    if(s<=m)cout<<"infinite\n";
    else{
        int l=0,r=3e14,best=0;
        while(l<=r){
            int mid=l+r>>1;
            if(check(mid))best=mid,l=mid+1;
            else r=mid-1;
        }
        cout<<best<<'\n';
    }
    return 0;
}

D

设 \(f_{i,0/1/2}\) 表示当前出到第 \(i\) 拳,当前 Takahashi 出的拳是 R,P,S,最多可以赢多少局。

然后 \(f_{1,0/1/2}\) 特殊计算一下,\(f_{i,j}\) 的值可以通过 \(f_{i-1,k}\) 转移来当且仅当 \(j\neq k\),取一个最大值然后增加对答案的贡献即可。时间复杂度为 \(O(n)\)。

容易发现本题必然有解。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1000100;
int a[N],n,m;
int box[N];
int f[N][3];
//f[i][0/1/2]:R/P/S
//R win S
//S win P
//P win R
signed main(){
    cin>>n;
    string s;
    cin>>s;
    s=' '+s;
    if(s[1]=='R'){
        f[1][0]=0;
        f[1][1]=1;
        f[1][2]=-1e18;
    }else if(s[1]=='P'){
        f[1][0]=-1e18;
        f[1][1]=0;
        f[1][2]=1;
    }else{
        f[1][0]=1;
        f[1][1]=-1e18;
        f[1][2]=0;
    }
    for(int i=2;i<=n;++i){
        if(s[i]=='R'){
            f[i][0]=max({f[i-1][1],f[i-1][2]});
            f[i][1]=max({f[i-1][0],f[i-1][2]})+1;
            f[i][2]=-1e18;
        }else if(s[i]=='P'){
            f[i][0]=-1e18;
            f[i][1]=max({f[i-1][0],f[i-1][2]});
            f[i][2]=max({f[i-1][0],f[i-1][1]})+1;
        }else{
            f[i][0]=max({f[i-1][1],f[i-1][2]})+1;
            f[i][1]=-1e18;
            f[i][2]=max({f[i-1][0],f[i-1][1]});
        }
    }
    cout<<max({f[n][0],f[n][1],f[n][2]})<<'\n';
    return 0;
}

E

这不是灵茶八题 T3?

看到异或就想到拆位计算答案。设当前枚举到第 \(k\) 位,这一位有 \(i\) 个 \(0\),\(j\) 个 \(1\),因为异或为 \(1\) 要求两个异或的数互不相同,所以这一位对答案的贡献即为 \(i\times j\times 2^k\)。

将所有位对答案的贡献累加即可。时间复杂度为 \(O(n\log W)\)。

void solve(){
    int n;cin>>n;
    for(int i=1;i<=n;++i)cin>>a[i],s[i]=a[i],a[i]^=a[i-1];
    int res=0;
    for(int k=0;k<30;++k){
        int cnt=0;
        for(int j=0;j<=n;++j)cnt+=a[j]>>k&1;
        res+=cnt*(n-cnt+1)*(1ll<<k);
    }
    for(int i=1;i<=n;++i)res-=s[i];
    cout<<res<<'\n';
}

F

看上去很难写,但是不会。

G

看到 \(2\times 10^5\) 和 \(5\) seconds,立马想到 \(O(n\sqrt n\log n)\) 算法!因此想到根号分治。

将所有员工分类:若员工 \(i\) 进入了房间超过 \(\sqrt m\) 次那么称为一类员工,否则称为二类员工。

对所有的一类员工都开一个动态开点线段树,也就是开最多 \(\sqrt m\) 个动态开点线段树。

然后暴力枚举任意两个一类员工并直接暴力合并信息计算答案。这个部分是 \(O(m\sqrt m\log m)\) 的。

然后考虑 \(Q\) 次查询:

  • 若两个员工均为一类员工,则直接套直接计算的答案,可以用一个 map 存储。
  • 若两个员工均为二类员工,则直接暴力计算答案。
  • 若一个员工为一类员工另一个为二类员工,则考虑暴力枚举二类员工的每一次进入的区间,然后找到一类员工所对应的动态开点线段树并区间查询找到重复的数量并求和。这个部分时间复杂度为 \(O(\sqrt m\log m)\)。

因为代码还没有调出来所以就先不放代码了。

标签:AtCoder,log,Beginner,int,cin,long,员工,补题,sqrt
From: https://www.cnblogs.com/yhbqwq/p/18341197

相关文章

  • AtCoder Beginner Contest 365 随笔
    擦,F假了A判断闰年B输出次大值的下标用pair排序后即可C给定一个数组\(A_n\)和整数\(M\),尝试找到一个最大的\(m\),使得:\[\sum_{i=1}^n\min(A_i,m)\leM\]不等号左边显然随着\(m\)的增大而增大,所以可以二分一个\(m\),然后判断即可D两个人玩\(n\)局剪刀石头布......
  • 2024牛客暑期多校训练营5赛后补题
    2024牛客暑期多校训练营5赛后补题B.珑题意:若干2×12\times12×1的多米诺骨牌去填充......
  • 2024牛客暑期多校训练营6赛后补题
    2024牛客暑期多校训练营6赛后补题B.Cake2题意:一块正n边形的蛋糕,沿着iii和i+......
  • Atcoder ABC298 D-F
    AtcoderABC298D-FD-WritingaNumeral链接:D-WritingaNumeral(atcoder.jp)简要题意:问题陈述我们有一个字符串\(S\)。初始值为\(S=\)1.按以下格式依次处理\(Q\)查询。1x:在\(S\)的末尾添加一个数字\(x\)。2:删除\(S\)开头的数字。3:以十进制形......
  • 每日一题——A - Max/Min AtCoder - abc356_e
    1.题目大意:枚举两个数的Max/Min向下取整之和。2.思路:一开始并没有想时间复杂度问题发现通过sort()排序来遍历每个最小值Min和后面最大值的和就是题目答案。你会发现仍然有问题,那就是取整的问题你就必须要优化然后发现很明显超时了。现在我们来换一个角度思考。搭配前缀和嘛。为......
  • 中山集训 day 1 day 3 模拟赛补题
    Round1A模拟即可。赛场上的写法我自认为写的挺好的。把所有的in替换成outans可以得到的所有串预处理出来,然后和其他原来的串判一下相等即可。Round1B很容易写错的题目。需要意识到\(dp_{\{\}}=x\),如果\(x\)的值更小的话,可以考虑将本来设为dp状态的四元组中的某......
  • Atcoder ABC297 E-G
    AtcoderABC297E-GE-KthTakoyakiSet链接:E-KthTakoyakiSet简要题意:问题陈述有\(N\)种章鱼烧出售。一个\(i\)-种的章鱼烧售价为\(A_i\)日元。高桥总共至少会买一个章鱼烧。他可以购买多个同类章鱼烧。求高桥可能支付的\(K\)个最低价格。在这里,如果有多......
  • Solution - Atcoder AGC052B Tree Edges XOR
    令\(w_{(u,v)}\)为边\((u,v)\)的边权。考虑到对于一条边进行操作影响的是有公共点的边,于是一个想法是把边权转到点权,用点权来表示边权。于是考虑对于每个点构造\(w_u\)使得\(w_{(u,v)}=w_u\oplusw_v\)。因为这是一颗树,所以一定存在合法的构造。其实到了这里,这种......
  • Atcoder ABC296 F
    AtcoderABC296FF-SimultaneousSwap链接:F-SimultaneousSwap(atcoder.jp)简要题意:问题陈述给你两个\(N\)数字序列:\(A=(A_1,A_2,\ldots,A_N)\)和\(B=(B_1,B_2,\ldots,B_N)\)。高桥可以重复下面的操作任意多次(可能为零)。在\(1\)和\(N\)之间选择三......
  • Educational Codeforces Round 168 (Rated for Div. 2) 补题记录(A~E)
    A直接暴力枚举字符添加在哪里,以及添加的字符是什么即可。#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintN=500100;signedmain(){intT;cin>>T;while(T--){strings;cin>>s;stringans;i......