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

AtCoder Beginner Contest 313

时间:2023-08-07 21:36:00浏览次数:48  
标签:AtCoder return Beginner 313 res long int define mod

AtCoder Beginner Contest 313

A - To Be Saikyo

思路:找到最大的,和第一个比较

#include<bits/stdc++.h>
using namespace std;
#define int long long
//#define int __int128
#define double long double
typedef pair<int,int>PII;
typedef pair<string,int>PSI;
typedef pair<string,string>PSS;
const int N=2e5+5,INF=0x3f3f3f3f,Mod=1e9+7,mod=998244353;
const double eps=1e-6;

int ksm(int x,int y){
    int res=1;
    while(y){
        if(y&1)res=res*x%mod;
        x=x*x%mod;
        y>>=1;
    }
    return res;
}
int c(int a,int b){
    if(b>a)return 0;
    int res=1;
    for(int i=1,j=a;i<=b;++i,--j){
        res=res*j%mod;
        res=res*ksm(i,mod-2)%mod;
    }
    return res;
}
int Lucas(int a,int b){
    if(a<mod&&b<mod)return c(a,b);
    return c(a%mod,b%mod)*Lucas(a/mod,b/mod)%mod;
}
void init(){

}


void solve(){
    int n;cin>>n;
    vector<int>ve(n);
    int ma=0;
    for(int i=0;i<n;++i){
        cin>>ve[i];
        if(i){
            ma=max(ma,ve[i]);
        }
    }
    if(ma>=ve[0]){
        cout<<abs(ma-ve[0])+1;
    }else cout<<0;
    return;
}
signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int T=1;
    init();
    //cin>>T;
    while(T--){
        solve();
    }
    return 0;
}
View Code

 

B - Who is Saikyo?

思路:保证有一个最大的,将一对关系中较小的一方标记,最大的一定没有被标记且没被标记的只有一个

#include<bits/stdc++.h>
using namespace std;
#define int long long
//#define int __int128
#define double long double
typedef pair<int,int>PII;
typedef pair<string,int>PSI;
typedef pair<string,string>PSS;
const int N=50+5,INF=0x3f3f3f3f,Mod=1e9+7,mod=998244353;
const double eps=1e-6;

int ksm(int x,int y){
    int res=1;
    while(y){
        if(y&1)res=res*x%mod;
        x=x*x%mod;
        y>>=1;
    }
    return res;
}
int c(int a,int b){
    if(b>a)return 0;
    int res=1;
    for(int i=1,j=a;i<=b;++i,--j){
        res=res*j%mod;
        res=res*ksm(i,mod-2)%mod;
    }
    return res;
}
int Lucas(int a,int b){
    if(a<mod&&b<mod)return c(a,b);
    return c(a%mod,b%mod)*Lucas(a/mod,b/mod)%mod;
}
void init(){

}


void solve(){
    int n,m;cin>>n>>m;
    vector<int>cnt(n+1);
    for(int i=0,x,y;i<m;++i){
        cin>>x>>y;
        cnt[y]++;
    }
    int ans,s=0;
    for(int i=1;i<=n;++i){
        if(cnt[i]==0)ans=i,s++;
    }
    if(s==1)cout<<ans;
    else cout<<-1;
    return;
}
signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int T=1;
    init();
    //cin>>T;
    while(T--){
        solve();
    }
    return 0;
}
View Code

 

 C - Approximate Equalization 2

思路:最终的数组取值为k=all/n(上取或下取)为最优情况,答案取大于k和小于k的操作的最大值(一加对应一减)

#include<bits/stdc++.h>
using namespace std;
#define int long long
//#define int __int128
#define double long double
typedef pair<int,int>PII;
typedef pair<string,int>PSI;
typedef pair<string,string>PSS;
const int N=50+5,INF=0x3f3f3f3f,Mod=1e9+7,mod=998244353;
const double eps=1e-6;

int ksm(int x,int y){
    int res=1;
    while(y){
        if(y&1)res=res*x%mod;
        x=x*x%mod;
        y>>=1;
    }
    return res;
}
int c(int a,int b){
    if(b>a)return 0;
    int res=1;
    for(int i=1,j=a;i<=b;++i,--j){
        res=res*j%mod;
        res=res*ksm(i,mod-2)%mod;
    }
    return res;
}
int Lucas(int a,int b){
    if(a<mod&&b<mod)return c(a,b);
    return c(a%mod,b%mod)*Lucas(a/mod,b/mod)%mod;
}
void init(){

}


void solve(){
    int n;cin>>n;
    vector<int>ve(n);
    int all=0;
    for(int i=0;i<n;++i)cin>>ve[i],all+=ve[i];
    int x=all/n,y=(all+n-1)/n;
    int xx=0,yy=0;
    for(int i=0;i<n;++i){
        if(ve[i]<x)xx+=abs(ve[i]-x);
        if(ve[i]>y)yy+=abs(ve[i]-y);
    }
    cout<<max(xx,yy);
    return;
}
signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int T=1;
    init();
    //cin>>T;
    while(T--){
        solve();
    }
    return 0;
}
View Code

 

D - Odd or Even

思路:可以发现奇偶性相加等同于奇偶性异或和,可先用k+1次:{1,...,k}、{2,...,k+1}、{3,...,1}、...、{k+1,...,k-1},可求出k*(a1+...+ak+1),由于k为奇数,那么前k+1次的提问的答案的和与(a1+...+ak+1)奇偶性相同;然后每一次的提问的答案异或上(a1+...+ak+1)即为1~k+1中缺少的那个数,这样便可求出1~k+1的所有数;

对于第i=[k+2,n]个数,提问为{1,...,k-1,i},便可求出ai

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

const int mod=998244353;
void solve(){
    int n,k;cin>>n>>k;
    vector<int>ve(n+1);
    int pre=0;
    for(int i=1;i<=k+1;++i){
        cout<<"?";
        for(int j=1;j<=k+1;++j)
            if(i!=j)cout<<" "<<j;
        cout<<'\n';
        cin>>ve[i];
        pre^=ve[i];
    }
    for(int i=1;i<=k+1;++i){
        ve[i]^=pre;
    }
    int a,b=0;
    for(int i=1;i<k;++i)b^=ve[i];
    for(int i=k+2;i<=n;++i){
        cout<<"?";
        for(int j=1;j<k;++j)cout<<" "<<j;
        cout<<" "<<i<<'\n';
        cin>>a;
        ve[i]=b^a;
    }
    cout<<"!";
    for(int i=1;i<=n;++i)cout<<" "<<ve[i];
    cout<<"\n";
}
signed main(){
    //ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int T=1;
    //cin>>T;
    while(T--){
        solve();
    }
    return 0;
}
View Code

 

E - Duplicate

思路:先判断操作次数是否有限,可以发现若要操作次数有限,相邻的两个数必有一个1,否则将会永远操作;

计算操作次数:res表示准备删除s[i]时的已有的操作次数;对于s[i],每一次操作s[i]增加(s[i]-'0'-1)个,当删除s[i]后的操作次数为res+res*(s[i]-'0'-1)+1,最后一个数不用删除,即res-1

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

const int mod=998244353;
void solve(){
    int n;
    string s;
    cin>>n>>s;
    for(int i=1;i<s.size();++i){
        if(s[i]!='1'&&s[i-1]!='1'){
            cout<<-1;return;
        }
    }
    int res=1;
    for(int i=s.size()-2;i>=0;--i){
        res=(res+res*(s[i+1]-'1')%mod+1)%mod;
    }
    res--;
    cout<<res;
}
signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int T=1;
    //cin>>T;
    while(T--){
        solve();
    }
    return 0;
}
View Code

 

标签:AtCoder,return,Beginner,313,res,long,int,define,mod
From: https://www.cnblogs.com/bible-/p/17612458.html

相关文章

  • AtCoder Beginner Contest 313
    AtCoderBeginnerContest313-AtCoderA-ToBeSaikyo(atcoder.jp)从\(a_1\dotsa_{n-1}\)找出最大值与\(a_0\)比较即可#include<bits/stdc++.h>#defineintlonglong#defineendl'\n'usingnamespacestd;signedmain(){ios::sync_with_st......
  • 取数游戏 Atcoder-abc128_d
    枚举两端取了几个数,将手中的负数从小到大放回序列即可#include<bits/stdc++.h>usingnamespacestd;intn,m,a[55],c[55],ans=-0x7fffffff;intmain(){scanf("%d%d",&n,&m);for(inti=1;i<=n;i++)scanf("%d",&a[i]);f......
  • Atcoder Grand Contest 058 F - Authentic Tree DP
    考虑给\(f(T)\)赋予组合意义。一个直观的想法是,在每条边中间新建一个节点,然后每次选择一条边对应的点,然后把它删掉,递归剩余的两个部分,但是你会发现这样分母不对,应该是\(n\)但在这个模型里只有\(n-1\)。考虑魔改这个模型。我们在每个边对应的点下面添加\(998244352\)个点,你......
  • Atcoder ABC313_C-Approximate Equalization 2
    AT_ABC313_C-ApproximateEqualization2Description:给定一个整数序列\(A=(A_1,A_2,···,A_n)\),可以做以下操作任意次(可能为0):选择一个整数对\((i,j)\)\((1\leqi,j\leqn)\),使得\(A[i]-\)=\(1\),\(A[j]+\)=\(1\),求出使得数列\(A\)中的\(max-min\leq1\)所需的最少......
  • [ABC313] C~E 题解
    [ABC313]C~E题解C-ApproximateEqualization2让所有的数字都尽量接近平均数,先算出平均数,然后把所有数字分成两份,一份要加,一份要减,因为平均数有余数,余数肯定给最大的几个,所以这样计算总共需要加减多少个,然后在加减里面取\(\max\)即可。时间复杂度:\(O(n\logn)\)#include......
  • Atcoder Beginner Contest 313
    CDEF有\(n(1\len\le40)\)张牌,每一张牌正面写上了数字\(a_i\),背面写上了数字\(b_i\)。最初所有牌都是正面朝上。有\(m\)个机器,每个机器有参数\(x_i,y_i(1\lex_i,y_i\len)\),\(x_i\)可以等于\(y_i\)。每个机器只能启动一次,并且有\(\frac{1}{2}\)的概率将牌\(......
  • [AT_abc313_d] Odd or Even
    简单题,但是为什么赛场上WA了呢?弱化题目,设\(n=k+1\),发现只需要每一个数不取询问\(k\)次,通过前缀和得出。再设\(k+1\|\n\),发现只需要类似分块即可解决。回到原题,最后的一部分如何计算?我们可以对\([n-k,n]\)这个区间做询问,但是对于已经计算的数不再去除。把......
  • [ABC313F] Flip Machines
    一种很新的折半/根号分治。手玩一下可以证明一个机器集合\(S\)的期望,先把\(S\)中\(x=y\)的机器对应的卡片翻好面,对于剩下的机器,如果一张卡片被至少一个机器覆盖过(即\(x=i\)或\(y=i\)),那么它的期望是\(\dfrac{a+b}{2}\),否则就是\(a\)。首先把\(x_i=y_i\)的机器处理掉......
  • AtCoder Beginner Contest 313
    A-ToBeSaikyo#include<bits/stdc++.h>usingnamespacestd;intmain(){ ios::sync_with_stdio(0),cin.tie(0); intn; cin>>n; vector<int>a(n); for(auto&i:a)cin>>i; cout<<max(0,*max_element(a.beg......
  • 「解题报告」AtCoder Beginner Contest 313
    比赛地址:AtCoderBeginnerContest313-AtCoder后记:请正确理解题意后再做题!!!A-ToBeSaikyoA-ToBeSaikyo(atcoder.jp)每个人有一个数值,问第一个人要加多少才能使得自己的数值变成最大的。就这么个破题我还WA了一发//Thecodewaswrittenbyyifan,andyifanis......