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

AtCoder Beginner Contest 313

时间:2023-08-07 19:15:34浏览次数:47  
标签:AtCoder Beginner 313 cin long int 异或 oplus define

AtCoder Beginner Contest 313 - AtCoder

A - To Be Saikyo (atcoder.jp)

从\(a_1 \dots a_{n-1}\)找出最大值与\(a_0\)比较即可

#include <bits/stdc++.h>
#define int long long
#define endl '\n'

using namespace std;

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    cin >> n;
    vector<int> A(n);
    for(auto &i : A) cin >> i;

    int ma = *max_element(A.begin() + 1, A.end());
    cout << max(ma - A[0] + 1, 0ll) << endl;

    return 0;
}

B - Who is Saikyo? (atcoder.jp)

每次将能力更弱的去掉,看最后是否还剩一个最强的

#include <bits/stdc++.h>
#define int long long
#define endl '\n'

using namespace std;

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int N,M;
    cin >> N >> M;

    set<int> A;
    for(int i = 1;i <= N;i ++)
        A.insert(i);

    for(int i = 0;i < M;i ++){
        int x,y;
        cin >> x >> y;
        A.erase(y);
    }

    if(A.size() == 1)
        cout << *A.begin() << endl;
    else
        cout << "-1\n";

    return 0;
}

C - Approximate Equalization 2 (atcoder.jp)

因为可以用大的去补小的,所以都往中间靠,要计算小于平均数的差多少到平均数,将这些分配好后,如果还有还有大于平均数+1的,还要继续分配,\(sum\bmod n\)就是计算多出来的,另外那些本身大于平均数的数只要减到比平均数多1即可,不用完全减到和平均数相等

#include <bits/stdc++.h>
#define int long long
#define endl '\n'

using namespace std;

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int N;
    cin >> N;
    vector<int> A(N + 1);
    int sum = 0;
    for(int i = 1;i <= N;i ++){
        cin >> A[i];
        sum += A[i];
    }

    int ans = 0,num = 0, tag = sum / N;
    for(int i = 1;i <= N;i ++){
        ans += max(tag - A[i], 0ll);
        num += (A[i] > tag);
    }

    cout << ans + max(sum % N - num,0ll) << endl;
    return 0;
}

D - Odd or Even (atcoder.jp)(交互题)

因为原数组仅由\(0,1\)构成,并且每次询问后\(a_1 + a_2 + \dots +a_k\)的和的奇偶性也是用\(01\)表示,所以我们可以把和当作$a_1 \oplus a_2 \oplus \dots \oplus a_k $的值.

当\(n=4,k=3\)时,我们可以询问1 2 3 ,1 2 4, 1 3 4 ,将三个结果的值异或之后就是\(a_1\)的值.

三个结果异或即:

\(res_1 \oplus res_2 \oplus res_3 = a_1 \oplus a_2 \oplus a_3 \oplus a_1 \oplus a_2 \oplus a_4 \oplus a_1 \oplus a_3 \oplus a_4\)

根据异或的性质,一个数异或自身偶数次等于\(0\),而0异或其他数等于其他数,所以上式的值就等于\(a_1\).

同理,如果再询问2 3 4,结合1 2 3,1 2 4,我们可以得到\(a_2\)的值.

由此我们对前\(k+1\)个数进行询问就能得到前\(k+1\)个数的值,那怎么得到\(k+2\)之后的值呢?

我们可以询问\(3,4 \dots k+1,k+2\)的结果,即\(a_3 \oplus a_4 \dots a_{k+1} \oplus a_{k+2}\)的值,且前面\(a_3 \sim a_{k+1}\)我们都已经知道了,那把前面这个\(res\)去异或上它们不就得到\(a_{k+2}\)的值了吗.

#include <bits/stdc++.h>

using namespace std;

signed main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);

	int N, K;
	cin >> N >> K;
	vector<int> ans(N);

	auto solve = [&]() {
		vector<int> T(K + 1);
		vector<int> Q;
		for (int i = 0; i <= K; i ++) {
			Q.clear();
			for (int j = 0; j <= K; j ++)
				if (j != i)
					Q.emplace_back(j);

			cout << '?';
			for (auto j : Q)
				cout << ' ' << j + 1 ;
			cout << endl;

			cin >> T[i];
		}

		for (int i = 0; i <= K; i ++)
			for (int j = 0; j <= K; j ++)
				if (j != i)
					ans[i] ^= T[j];
	};

	solve();

	for (int i = K + 1; i < N; i ++) {
		cout << '?';
		for (int j = i; j > i - K; j--)
			cout << ' ' << j + 1;
		cout << endl;

		cin >> ans[i];
		for (int j = i - 1; j > i - K; j --)
			ans[i] ^= ans[j];
	}

	cout << '!';
	for (auto i : ans)
		cout << ' ' << i;
	cout << endl;

	return 0;
}

标签:AtCoder,Beginner,313,cin,long,int,异或,oplus,define
From: https://www.cnblogs.com/Kescholar/p/17612462.html

相关文章

  • 取数游戏 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......
  • ABC313
    D-OddorEven假设\(A_1\)到\(A_{k-1}\)的和是偶数。那么通过\(n\)次询问可以得到所有数是\(0\)还是\(1\)。如果将\(A_1\)到\(A_{k-1}\)代入检验发现和不是偶数,由于\(k\)是奇数,反转所有数,可以使它合法。#include<bits/stdc++.h>usingnamespacestd;consti......