首页 > 其他分享 >[ABC313] C~E 题解

[ABC313] C~E 题解

时间:2023-08-07 12:33:14浏览次数:31  
标签:cout int 题解 ABC313 奇偶性 异或 tie include

[ABC313] C~E 题解

C - Approximate Equalization 2

让所有的数字都尽量接近平均数,先算出平均数,然后把所有数字分成两份,一份要加,一份要减,因为平均数有余数,余数肯定给最大的几个,所以这样计算总共需要加减多少个,然后在加减里面取 \(\max\) 即可。

时间复杂度:\(O(n\log n)\)

#include <algorithm>
#include <iostream>
#define int long long
using namespace std;
const int N = 2e5 + 10;

int n, a[N];
signed main()
{
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    cin >> n;
    int s = 0, r;
    for(int i = 1; i <= n; i ++)
        cin >> a[i], s += a[i];
    r = s % n, s /= n;
    sort(a + 1, a + n + 1);
    int cnt1 = 0, cnt2 = 0;
    for(int i = 1; i <= n - r; i ++) {
        if(a[i] <= s)
            cnt1 += s - a[i];
        else cnt2 += a[i] - s;
    }
    for(int i = n - r + 1; i <= n; i ++) {
        if(a[i] <= s + 1)
            cnt1 += s - a[i];
        else cnt2 += a[i] - s - 1;
    }
    cout << max(cnt1, cnt2) << '\n';
    return 0;
}

D - Odd or Even

设前 \(k - 1\) 个数的和的奇偶性为 \(x\),则使用 \(n - k + 1\) 次询问得到 \(A_{k\sim n}\) 异或 \(x\) 的奇偶性。

考虑得到 \(A_{1\sim k - 1}\) 异或 \(x\) 的奇偶性,考虑用别的位置的贡献消除 \(A_i\) 的贡献,由于 \(k < n\) 所以 \(A_{n - 1}\) 的贡献已经被算过了,不妨用 \(A_{n - 1}\) 消除贡献,可以考虑如下构造:a[n - 1] xor a[n] xor queryquery 查询 \(\{j\in{[1, k -1]\wedge j\ne i}\vee j = [n - 1, n]\}\),这样就可以得到 \(A_i \oplus x\) 的奇偶性,由于 \(k\) 是奇数,所以前 \(k\) 个数的奇偶异或 \(x\) 的异或和等于原值的异或和异或 \(x\),也就是 \(A_k\),将 \(A_k \oplus x\) 与 \(A_k\) 比较可得出 \(x\) 的奇偶性,然后全部数字异或 \(x\) 消除它的影响就是原数组了。

时间复杂度:\(O(nk)\)。

// Problem: D - Odd or Even
// Contest: AtCoder - AtCoder Beginner Contest 313
// Author: Moyou
// Copyright (c) 2023 Moyou All rights reserved.
// Date: 2023-08-05 20:27:06

#include <algorithm>
#include <cstring>
#include <iostream>
#include <vector>
#include <numeric>
using namespace std;
const int N = 2e5 + 10;

int n, k;
bool a[N];
int t[N], tmp[N], x;
int ask() {
    memcpy(tmp, t, sizeof t);
    sort(tmp + 1, tmp + k + 1);
    cout << "? ";
    for(int i = 1; i <= k; i ++) cout << tmp[i] << ' ';
    int x;
    cout << '\n' << flush;
    cin >> x;
    return x;
}

signed main()
{
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    cin >> n >> k;
    iota(t + 1, t + k + 1, 1);
    for(int i = k; i <= n; i ++) {
        t[k] = i;
        a[i] = ask();
    }
    for(int i = 1; i < k; i ++) {
        t[i] = n - 1;
        a[i] = a[n] ^ ask() ^ a[n - 1];
        t[i] = i;
    }
    int sum = 0;
    for(int i = 1; i <= k; i ++) sum += a[i];
    sum &= 1;
    sum ^= a[k]; 
    for(int i = 1; i <= n; i ++)
        a[i] ^= sum;
    cout << "! ";
    for(int i = 1; i <= n; i ++) cout << a[i] << ' ';
    cout << '\n' << flush;

    return 0;
}

E - Duplicate

首先观察到如果有连续两个数字大于 \(2\),则会无限循环,这样会让其中一个数字无限复制。

所以假设第 \(i\) 个位置之后的都已经被消除了,使用了 \(step\) 步,现在要消除第 \(i\) 个位置的字符,则它身后的字符会复制 \((step + 1)(s_i - 1)\) 次,这样迭代更新 \(step\) 直到只剩一个字符为止。

时间复杂度:\(O(n)\)。

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

标签:cout,int,题解,ABC313,奇偶性,异或,tie,include
From: https://www.cnblogs.com/MoyouSayuki/p/17611143.html

相关文章

  • 题解 P6831 - [IOI2020] 嘉年华奖券
    小清新IOI题。首先考虑怎么求出答案。等价于我选择\(\dfrac{nk}{2}\)个数令它们系数为\(1\),再选\(\dfrac{nk}{2}\)个数令它们系数为\(-1\),最大化每个数的值乘以系数之和,并且要求每个奖券选择的数的个数恰好是\(k\)个。考虑先令每个奖券的前\(k\)个数系数为\(-1\),然......
  • HHKB2020 D 题解
    problem&blog。特判一下\(a+b>n\)时为\(0\)。正难则反,计算重叠的方案数。重叠即\(x,y\)轴均有交集,于是转化为两条线段相交的方案数(两条线段认为是不同的)。正难则反,计算不相交的方案数。第一条线段有\((n-b+1)-a+1=n-a-b+2\)种可能,第二条有\((n-a-b+1)\)种可能,故方案......
  • [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\)的机器处理掉......
  • 题解 [POI2012] OKR-A Horrible Poem
    题目链接询问循环节的“模板题”?首先,有一个经典结论:若存在一长度为\(len\)的循环节,则\(s[l\simr-len]=s[l+len\simr]\),简单来说就是利用移位,说明是否是循环节。有了这个结论,再使用字符串哈希,我们就可以做到\(O(1)\)判断。因为:字符串长度=循环节长度\(\times\)循环......
  • [国家集训队] Tree II 题解报告
    [国家集训队]TreeII一道·真·板子·题就是练习LCT懒标记的题目除了翻转标记以外还要维护乘法标记和加法标记注意加法标记和乘法标记的维护!!!加法标记因为splay的区间大小不是固定的,所以我们要维护size,并且子树的sum要加上size乘上标记其他的就只用直接加上即可voidpusha......
  • 题解 P8085 [COCI2011-2012#4] KRIPTOGRAM
    题目链接题目问的是相对位置是否一样,即若\(s\)的第\(1,2,3\)个字符串相等,\(t\)的第\(1,2,3\)个字符串也相等,则\(s=t\)。由于\(t\)的长度是固定的,所以我们使用哈希进行快速匹配。那么如何设计哈希函数则成为本题的难点。由于问相对位置,那么可以记\(val[i]\)表示......
  • 『MGOI』Simple Round I | B. 魔法照相馆 题解
    题目传送门一道模拟题。并不复杂的模拟题,也不需要用到贪心。我们可以创建一个数组来记录每个幕布是否被拉上,统计答案的时候,就看看这块幕布前面有多少个没拉上的,最后如果这块幕布拉上了,就重新放下来就行了。#include<bits/stdc++.h>#definelllonglong#defineINF1e9usi......
  • 【题解】Codeforces Round 890(CF1856)
    赛时过了A-E1,rk195可惜是E2傻逼了不会背包优化了,直接连普及组水平都不到了。A.TalesofaSort题目描述:给定长度为\(n\)的序列\(a\),每次操作为对于所有\(i\)将\(a_i\)变为\(\max(a_i-1,0)\),询问最少多少次操作之后可以让序列\(a\)单调不降。题目分析:唯一能改变......
  • 【题解】Luogu[P9504] 『MGOI』Simple Round I C. 魔法禁林
    Link这题我们发现如果直接去枚举生命和法力值显然是不行的,又看到说最小的生命值,不禁想到最短路,但是怎么跑?我们令经过一条边之前魔力值为\(k\),那么该边的边权为\(\lfloor\dfrac{w}{k}\rfloor\),于是我们讲题目转化为了边权为\(\lfloor\dfrac{w}{k}\rfloor\)时\(s\)到\(t\)......