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

AtCoder Beginner Contest 347

时间:2024-04-13 18:55:41浏览次数:13  
标签:AtCoder Beginner int i32 cin long i64 347 using

A - Divisible

#include <bits/stdc++.h>

using namespace std;

using i32 = int32_t;
using i64 = long long;

#define int i64

using vi = vector<i64>;
using pii = pair<int, int>;
using piii = tuple<int, int, int>;


const int inf = 1e18;

i32 main() {
    ios::sync_with_stdio(false), cin.tie(nullptr);
    int n , k;
    cin >> n >> k;
    for( int i = 1 , x ; i <= n ; i ++ ){
        cin >> x;
        if( x % k == 0 ) cout << x / k << " ";
    }
    return 0;
}

B - Substring

#include <bits/stdc++.h>

using namespace std;

using i32 = int32_t;
using i64 = long long;

#define int i64

using vi = vector<i64>;
using pii = pair<int, int>;
using piii = tuple<int, int, int>;


const int inf = 1e18;

i32 main() {
    ios::sync_with_stdio(false), cin.tie(nullptr);
    string s;
    cin >> s;
    set<string> cnt;
    for (int i = 0; i < s.size(); i++)
        for (int j = 1; i + j <= s.size(); j++)
            cnt.insert(s.substr(i, j));
    cout << cnt.size() << "\n";
    return 0;
}

C - Ideal Holidays

首先要做一个取模,然后枚举取模后所有的点做起点,判断能不能把所有的工作都安排在假期。

#include <bits/stdc++.h>

using namespace std;

using i32 = int32_t;
using i64 = long long;

#define int i64

using vi = vector<i64>;
using pii = pair<int, int>;
using piii = tuple<int, int, int>;


const int inf = 1e18;

i32 main() {
    ios::sync_with_stdio(false), cin.tie(nullptr);
    int n, a, b;
    cin >> n >> a >> b;
    b += a;
    vi d(n);
    for (auto &i: d) {
        cin >> i, i = (i - 1) % b;
    }
    set<int> c;
    for (auto i: d)
        c.insert(i);
    if( c.size() == 1 ){
        cout << "Yes\n";
        return 0;
        
    }
    while (true) {
        int x = *c.begin();
        if (x >= b) break;
            c.erase(c.begin());
        if (*c.rbegin() < x + a) {
            cout << "Yes\n";
            return 0;
        }
        c.insert(x + b);
    }
    cout << "No\n";
    return 0;
}

D - Popcount and XOR

首先我们统计出\(popcpunt(C) = t\)。然后我们\(X,Y\)异或能得到的数的一的数量的范围是\([abs(X-Y) , X + Y]\),判断\(t\)是否在这个范围内。

然后我们设抵消的一的个数有\(x\)个,则题目可知$a + b - 2*x = t \(,则\)a + b + t = 2t - 2 * x \(,所以\)a+b+t\(一定是偶数,并且\)\frac{a + b + 2 }{ 2} = t - x $,根据题目可知\(0\le \frac {a+b+t}{2} \le 60\)恒成立。

然后我们算出\(x\)的值,开始一位位的遍历\(C\)即可,每一位的值如果是0,就可以给两个两个数这一位赋值为 1,如果是 1 就可以跟任意一个数赋值为 1.

#include <bits/stdc++.h>

using namespace std;

using i32 = int32_t;
using i64 = long long;

#define int i64

using vi = vector<i64>;
using pii = pair<int, int>;
using piii = tuple<int, int, int>;
using node = bitset<60>;

const int N = (1ll << 60);

i32 main() {
    int a, b, c;
    cin >> a >> b >> c;
    node C(c);
    int t = C.count();
    if (a + b < t or t < abs(a - b) or (a + b + t) % 2 != 0 or (a + b + t) / 2 > 60) {
        cout << "-1\n";
        return 0;
    }
    t = (a + b - t) / 2, a -= t, b -= t;
    int x = 0, y = 0;
    for (int i = 59; i >= 0; i--) {
        x <<= 1, y <<= 1;
        if (C[i]) {
            if (a > 0) x |= 1, a--;
            else if (b > 0) y |= 1, b--;
        } else {
            if (t > 0) x |= 1, y |= 1, t--;
        }
    }
    cout << x << " " << y << "\n";

    return 0;
}

E - Set Add Query

set模拟出这个集合,并把第\(i\)次操作后set的大小记为\(sum[i]\),并且统计出每个数字操作的位置。

对于每个数字,实际上就是奇数次操作到偶数次操作中间的部分,这一部分可以用前缀和快速求出来。

#include <bits/stdc++.h>

using namespace std;

using i32 = int32_t;
using i64 = long long;

#define int i64

using vi = vector<i64>;
using pii = pair<int, int>;
using piii = tuple<int, int, int>;

const int inf = 1e18;

i32 main() {
    int n, q;
    cin >> n >> q;
    vector<vi> op(n + 1);
    vi sum(q + 1);
    set<int> s;
    for (int i = 1, x; i <= q; i++) {
        cin >> x;
        if (s.count(x)) s.erase(x);
        else s.insert(x);
        sum[i] = sum[i - 1] + s.size();
        op[x].push_back(i);
    }
    for (auto &it: op)
        if (it.size() % 2 == 1) it.push_back(q + 1);
    for (int i = 1, ans; i <= n; i++) {
        ans = 0;
        for (int j = 1; j < op[i].size(); j += 2)
            ans += sum[op[i][j] - 1] - sum[op[i][j - 1] - 1];
        cout << ans << " ";
    }
    return 0;
}

标签:AtCoder,Beginner,int,i32,cin,long,i64,347,using
From: https://www.cnblogs.com/PHarr/p/18133203

相关文章

  • atcoder beginer 347 (abc347) D E 题解
     D就是二进制下,哪些位置有重合(两个1),哪些位置没有重合(1个1,1个0),剩下的都是0。xor的结果<2^60,就是小于60位(二进制下)。注意要有要求两个数需要是2^60,于是要有大小的判断,因为有的a,b会2^60,但是按照题目要求,这个情况不行。比如xor的结果,60位都是1,然后a、b各有60个1,那么需要有30个1......
  • atcoder beginer 348 (abc348) D E F 题解
     E非常经典的树上操作(树上DP)。父节点到某个子节点,值是如何变化的。1#include<cstdio>2#include<cstdlib>3#include<cstring>4#include<cmath>5#include<cstdbool>6#include<string>7#include<algorithm>8#include<iost......
  • AtCoder Beginner Contest 348
    B-FarthestPoint难度:⭐题目大意一个坐标系有x个点,对于每个点找出距离其最远的点;解题思路数据很小,暴力就行;神秘代码#include<bits/stdc++.h>#defineintlonglong#defineIOSios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#defineendl'\n'......
  • P3478 [POI2008] STA-Station
    题目链接:既然让求深度之和,那么我就定义以\(i\)为根时深度之和为\(f_i\),现在就是思考状态转移的问题。如果以某种手段得到了\(f_1\),那么接下来的转移就好说了。设\(u\)为当前节点,\(j\)是当前节点的子节点。\(s_i\)表示以\(i\)为根的子树中的节点数量,则\(s_u=1+\sum{s......
  • [ABC348] Atcoder ABC 248 A~G 题解
    [ABC348]AtcoderABC248A~G题解A模拟B模拟,不卡精度。C模拟D注意,药不可以拿着,只可以在那个格子吃掉。这就意味着,我们无论何时到达某个点,到达的点的集合都是固定的。所以对于每个药店跑BFS,然后看起点到终点是否连通即可。intn,m,k,ad[N][N],f[N][N],in[N][N],......
  • AtCoder Beginner Contest 348 A-F 题解
    A-PenaltyKickQuestion高桥将在一场足球比赛中获得\(N\)个点球。对于第\(i\)个罚球,如果\(i\)是\(3\)的倍数,他将罚球失败,否则罚球成功。请打印他罚球的结果。Solution当\(i\%3==0\)时说明能被\(3\)整除Code#include<bits/stdc++.h>usingnamespacest......
  • AtCoder Beginner Contest 348
    地址。赛时情况A、B题都很显然,C题大概推了好一会儿,最后还是做出来了。D题感觉十分难做,估计很难写,看了E。感觉还是不会,听说是原题,搜了一下,发现是树的重心,我还不会。直接贺题解,发现不对。修改了一下还是不对,最后发现INF取小了,过了。后面的不看了。赛后总结还行,跳过D......
  • AtCoder Beginner Contest 204
    E-RushHour2设函数f(t)=t+ci+di/(t+1);易得当t=sqrt(di)-1时取最小所以根据时间来做dij当时间大于sqrt(di)-1时直接加入即可同时用并查集来查看1和n是否联通即可accode:点击查看代码#include<bits/stdc++.h>#defineintlonglong#defineall(x)x.begin(),x.end()......
  • 代码随想录算法训练营Day13|239滑动窗口最大值 347前k个高频元素
    学习了Carl的视频今日任务 239. 滑动窗口最大值 (一刷至少需要理解思路)之前讲的都是栈的应用,这次该是队列的应用了。本题算比较有难度的,需要自己去构造单调队列,建议先看视频来理解。 题目链接/文章讲解/视频讲解:代码随想录 347.前 K 个高频元素 (一刷至少需要理......
  • AtCoder Beginner Contest 348
    A-PenaltyKick(abc348A)题目大意给定\(n\),输出\(ooxooxoox...\),长度为\(n\)。解题思路按题意模拟即可。神奇的代码n=int(input())ans="oox"*(n//3)+"o"*(n%3)print(ans)B-FarthestPoint(abc348B)题目大意给定\(n\)个点,对每个点,求出与其......