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

AtCoder Beginner Contest 313

时间:2023-08-07 10:35:37浏览次数:36  
标签:AtCoder cnt Beginner 313 res cin long int 异或

A - To Be Saikyo

#include <bits/stdc++.h>

using namespace std;


int main(){
	ios::sync_with_stdio(0),cin.tie(0);
	int n;
	cin >> n;
	vector<int> a(n);
	for( auto & i : a ) cin >> i;
	cout << max( 0 , *max_element( a.begin()+1 , a.end() ) + 1 - a.front() )<< "\n";
	return 0; 
}

B - Who is Saikyo?

#include <bits/stdc++.h>

using namespace std;


int main(){
	ios::sync_with_stdio(0),cin.tie(0);
	int n , m;
	cin >> n >> m;
	vector<int> f( n+1 , 1 );
	for( int x , y ; m ; m -- )
		cin >> x >> y ,f[y] = 0;
	int res = -2;
	for( int i = 1 ; i <= n ; i ++ ){
		if( f[i] == 1 ){
			if( res == -2 ) res = i;
			else res = -1;
		}
	}
	if( res == -2 ) res = -1;
	cout << res << "\n";
	return 0;
}

C - Approximate Equalization 2

先把期望的序列求出来,然后两个序列分别排序作差即可

#include <bits/stdc++.h>

using namespace std;

#define int long long

int32_t main(){
	ios::sync_with_stdio(0),cin.tie(0);
	int n;
	cin >> n;
	int cnt = 0;
	vector<int> a(n);
	for( auto & i : a ) cin >> i , cnt += i;
	sort( a.begin() , a.end() );
	vector<int> b(n , cnt / n );
	cnt = cnt % n;
	for( int i = 0 ; i < cnt ; i ++ ) b[i] ++;
	reverse( b.begin() , b.end() );
	int res = 0;
	for( int i = 0 ; i < n ; i ++ )
		if( a[i] > b[i] ) res += a[i] - b[i];
	cout << res << "\n";
	return 0;
}

D - Odd or Even

这里回答的是子序列的奇偶性实际上就是异或和。

如果两个子序列的只有一个数不同,那么两个子序列异或和的异或等价这两个不同的数的异或。

所以我们可以推出\([2,k]\)中每个数的与\(1\)的异或,在结合\([1,k]\)的异或和就能推出\([1,k]\)的值。

然后再计算\(i\)与\(i+k\)的异或,进而推出整个序列。

当然询问的方法有很多。

#include <bits/stdc++.h>

using namespace std;

#define int long long

const int mod = 998244353;

int32_t main() {
    int n, k;
    cin >> n >> k;

    auto q = [](int l, int r, int x) {
        vector<int> v;
        for (int i = l; i <= r; i++)
            if (i != x) v.push_back(i);
        return v;
    };

    auto query = [](const vector<int> &v) {
        cout << "?";
        for (auto i: v)
            cout << " " << i;
        cout << endl << flush;
    };


    map<vector<int>, int> mp;
    for (int i = 1, t; i <= k; i++) {
        auto v = q(1, k + 1, i);
        query(v);
        cin >> t;
        mp[v] = t;
    }
    for (int i = 1, t; i <= n - k + 1; i++) {
        auto v = q(i, i + k - 1, 0);
        if (mp.count(v) > 0) continue;
        query(v);
        cin >> t;
        mp[v] = t;
    }

    int T1 = mp[q(1, k + 1, 1)];
    int cnt = 1;
    for (int i = 2; i <= k; i++)
        cnt += (T1 == mp[q(1, k + 1, i)]);

    vector<int> a(n + 1);
    a[1] = (mp[q(1, k, 0)] == (cnt & 1));

    for (int i = 2; i <= k; i++) {
        if (T1 == mp[q(1, k + 1, i)]) a[i] = a[1];
        else a[i] = !a[1];
    }
    for (int i = 1; i <= n - k; i++) {
        if (mp[q(i, i + k - 1, 0)] == mp[q(i + 1, i + k, 0)]) a[i+k] = a[i];
        else a[i+k] = !a[i];
    }
    cout << "!";
    for( int i = 1 ; i <= n ; i ++ )
        cout << " " << a[i];
    cout << endl << flush;
    return 0;

}

E - Duplicate

先考虑\(-1\)的情况,如果任意两个相邻的数都不为 1 那么这个地方就可以无限延长,答案就是\(-1\)

然后我们考虑倒序统计答案\(res\),对于当前的字符他每次被复制了\(s[i+1]-1\)个,一共复制了\(res\)次加上原本的\(1\)个,所以我们需要\(res\times(s[i+1]-1)+1\)次才可以把他完全删除掉。为什么是这个式子?因为能够被复制的数字只有\(1\)所以被复制的数字不会自己复制自己。

要注意的是,最后一个数字不需要删除,所以最后的答案还要减 1

#include <bits/stdc++.h>

using namespace std;

#define int long long

const int mod = 998244353;

int32_t main(){
    ios::sync_with_stdio(0),cin.tie(0);
    int n;
    string s;
    cin >> n >> s;
    for( int i = 1 ; i < n ; i ++ )
        if( s[i] != '1' && s[i-1] != '1' )
            cout << -1 , exit(0);

    int res = 1;
    for( int i = n-2 ; i >= 0 ; i -- ){
        res = ( res + 1 + res * ( s[i+1] - '1' ) % mod ) % mod;
    }
    cout << res - 1 << "\n";
    return 0;
}

标签:AtCoder,cnt,Beginner,313,res,cin,long,int,异或
From: https://www.cnblogs.com/PHarr/p/17610770.html

相关文章

  • 「解题报告」AtCoder Beginner Contest 313
    比赛地址:AtCoderBeginnerContest313-AtCoder后记:请正确理解题意后再做题!!!A-ToBeSaikyoA-ToBeSaikyo(atcoder.jp)每个人有一个数值,问第一个人要加多少才能使得自己的数值变成最大的。就这么个破题我还WA了一发//Thecodewaswrittenbyyifan,andyifanis......
  • ABC313
    D-OddorEven假设\(A_1\)到\(A_{k-1}\)的和是偶数。那么通过\(n\)次询问可以得到所有数是\(0\)还是\(1\)。如果将\(A_1\)到\(A_{k-1}\)代入检验发现和不是偶数,由于\(k\)是奇数,反转所有数,可以使它合法。#include<bits/stdc++.h>usingnamespacestd;consti......
  • AtCoder Beginner Contest (ABC) 313 D-E
    Tasks-AtCoderBeginnerContest313PS:当时看到D过的比E多就一直在考虑D,但还没做出来,其实个人感觉E比D简单。 D-OddorEven交互题。有n个数,最多可以询问n次然后要求判断出这n个数的奇偶性。每次可以询问数组里任意k个元素的和是不是奇数一开始想到的是高斯消元,n次总能......
  • AtCoder Beginner Contest 313 A-E Code
    比赛链接:AtCoderBeginnerContest313-AtCoder A:#include<bits/stdc++.h>usingnamespacestd;intmain(){cin.tie(0);ios::sync_with_stdio(false);intn;cin>>n;intp1;cin>>p1;intma......
  • ABC313
    T1:ToBeSaikyo\(x\geqslant\max({p_i}),i>1\)代码实现n=int(input())a=list(map(int,input().split()))ifn==1:exit(print(0))mx=max(a[1:])ans=max(0,mx+1-a[0])print(ans)T2:WhoisSaikyo?对\((A_i,B_i)\)连一条有向边,使得\(A_i......
  • ABC313C 解题报告
    赛前看到这场C的分值直接飙上\(400\)就知道不是个善茬。这道题给了个启发,算是积累个trick吧。题目传送门简要题意:给定长为\(n\)的序列,进行若干次以下操作:每次选定两个整数\(i\)和\(j\),使得\(a_{i}\leftarrowa_{i}+1\)并使得\(a_{j}\leftarrowa_{j}-1\),要求最......
  • abc313D 题解
    [abc313DOddorEven]。好有趣捏。我们考虑\(N=K+1\)。设\(s_i\)为\(\displaystyle\sum_{j\neqi}a_j\bmod2\)。因为\(K\)为奇数,我们可以得到\(\displaystyle\sum_{i=1}^{K+1}s_i\equiv\sum_{i=1}^{K+1}a_i\pmod2\)。所以\(a_i=\displaystyle\sum_{i=1}^{K+1}a_i\b......
  • Practice on Codeforces and Atcoder in August
    EducationalCodeforcesRound151A~ECodeforcesRound#879Div.2CodeforcesRound#882Div.2CodeforcesRound#873Div.2......
  • Toyota Programming Contest 2023#4(AtCoder Beginner Contest 311)
    Preface补下好久之前打的比赛博客这场前面都写的挺稳的,然后一到G就降智了没写出来A-FirstABC签到#include<cstdio>#include<iostream>#include<utility>#include<vector>#include<cstring>#include<cmath>#include<algorithm>#include<queue>#i......
  • nfls15095 Atcoder-abc123_d 蛋糕
    Atcoder-abc123_dAT小卖部从下学期开始售卖带有数字形状的蛋糕,\(X\),\(Y\)和\(Z\)种蛋糕分别带有\(1\)形,\(2\)形和\(3\)形蜡烛,而且每个蛋糕都有美味值,如下所示:带有\(1\)形蜡烛的美味值有:\(A_1,A_2,\cdots,A_X\)带有\(2\)形蜡烛的美味值有:\(B_1,B_2,\cdots,B_Y\)......