首页 > 其他分享 >AtCoder Regular Contest 164 A~C

AtCoder Regular Contest 164 A~C

时间:2023-07-13 22:34:27浏览次数:47  
标签:AtCoder int ll find second Regular 164 Bob 节点

A题都没做出来(被自已菜晕

A. Ternary Decomposition

A - Ternary Decomposition (atcoder.jp)

题意

给定一个正整数\(N\),问是否存在\(K\)个整数,使得\(N=3^{m_1}+3^{m_2}+...+3^{m_k}\)

思路

首先对于一个正整数\(N\),最多有\(N\)个整数使得正式成立,即\(m_i\)全为0。再对\(N\)进行三进制拆分,可得到最少使得原式成立的个数。

在三进制拆分后,所有指数不为0的项都能再拆分为三项,使项数加二。因此,\(k\)如果在最大值和最小值之间,并且奇偶性与\(N\)相同就存在,否则不存在。

代码

void solve() {
    ll k, n;
    cin >> n >> k;
 
    ll mx = n, mn = 0;
    while(n) {
        mn += n % 3;
        n /= 3;
    }
 
    if(k >= mn && k <= mx && k % 2 == mx % 2) {
        cout << "Yes\n";
    } else {
        cout << "No\n";
    }
}

B. Switching Travel

B - Switching Travel (atcoder.jp)

题意

给定一个无向图,每个节点为白色或黑色。只有当边的两端节点颜色不一样时,才能移动,且每离开一个节点,该节点的颜色就会变成另一种颜色。可以随便选择一个节点作为起点,求能否回到起点。

思路

如果图中存在一个环,起点和终点颜色相同,其余节点颜色交替出现,则说明能回到起点。

遍历边,如果一条边的两端节点颜色不同,合并到一个集合中。之后再遍历一次边,如果边两端的节点颜色相同,则查询它们是否在同一集合中,如果是,则说明存在一个满足条件的环。

代码

#include<bits/stdc++.h>

using namespace std;
using ll = long long;

struct DSU {
    vector<int> p;
    
    DSU(int n) : p(n) {iota(p.begin(), p.end(), 0);}
    
    int find(int x) {
        while(x != p[x]) x = p[x] = p[p[x]];
    }
    
    bool merge(int x, int y) {
        x = find(x);
        y = find(y);
        if(x == y) return false;
        p[y] = x;
        return true;
    }
    
    bool same(int x, int y) {return find(x) == find(y);}
};

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

    int n, m;
    cin >> n >> m;

    vector<pair<int, int>> e(m);
    for(int i = 0; i < m; i++) {
        cin >> e[i].first >> e[i].second;
    }

    vector<int> c(n + 1);
    for(int i = 1; i <= n; i++) {
        cin >> c[i];
    }

    DSU D(n + 1);
    for(int i = 0; i < m; i++) {
        if(c[e[i].first] != c[e[i].second]) {
            D.merge(e[i].first, e[i].second);
        }
    }

    for(int i = 0; i < m; i++) {
        if(c[e[i].first] == c[e[i].second] && D.same(e[i].first, e[i].second)) {
            cout << "Yes\n";
            return 0;
        }
    }

    cout << "No\n";

    return 0;
}

c. Reversible Card Game

C - Reversible Card Game (atcoder.jp)

题意

给定若干张牌,牌的正反两面写有数字。Alice的回合会把场上某一张牌翻转,Bob的回合会把场上一张牌拿走并获得该牌朝上的数字。Alice想要Bob获得的数字之和最小,Bob想要获得的数字之和最大。求Bob最终能获得多少数字。

思路

Bob到最后会拿走所有的牌,为了使Bob获得的值减少,Alice每次翻转正面减反面差值最大的牌,而Bob会拿走差值最大的牌不让Alice翻,因此用一个优先队列模拟即可。

代码

#include<bits/stdc++.h>

using namespace std;
using ll = long long;

struct node {
    int a, b;
    bool operator <(const node &T) const {return a - b < T.a - T.b;}
};

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

    int n;
    cin >> n;

    priority_queue<node> q;
    for(int i = 0; i < n; i++) {
        int a, b;
        cin >> a >> b;
        q.push({a, b});
    }

    ll ans = 0;
    while(!q.empty()) {
        int x = q.top().a, y = q.top().b;
        q.pop();
        q.push({y, x});
        ans += q.top().a;
        q.pop();
    }

    cout << ans << "\n";

    return 0;
}

标签:AtCoder,int,ll,find,second,Regular,164,Bob,节点
From: https://www.cnblogs.com/cenqi/p/17552373.html

相关文章

  • AtCoder Beginner Contest 161
    AtCoderBeginnerContest161https://atcoder.jp/contests/abc161这套不算难,但是sb我还是写不出来是为什么呢F是个妙妙题C-ReplacingIntegerWA了一次所以放上来#include<bits/stdc++.h>#definelllonglongusingnamespacestd;intmain(){lla,b;c......
  • AtCoder Grand Contest 012 D Colorful Balls
    洛谷传送门AtCoder传送门不错的题。bxEnder32k。我们发现交换有传递性,那么我们能交换就连边,答案是\(\prod\frac{(sz)!}{\prodc_i!}\),其中\(sz\)为连通块大小,\(c_i\)为这个连通块中第\(i\)种颜色出现次数。于是我们得到了一个\(O(n^2)\)的做法。发现很多遍是无用的......
  • AtCoder Regular Contest 164 E Segment-Tree Optimization
    洛谷传送门AtCoder传送门妙妙题。我们考虑如何方便地描述一棵广义线段树。不难想到使用断点描述,即对于一个结点\([l,r]\),它的左右儿子分别是\([l,mid],[mid+1,r]\),其中\(mid\in[l,r-1]\),然后把一层缩成一个\(2^{d-1}\)的序列,每一层都是上层对应结点的\(mid......
  • Atcoder ABC 309 F
    AtcoderABC309F题意n个盒子,长宽高为\(x,y,z,\)(长宽高是相对的,可以任意调换),问是否有一个盒子可以完全容纳另一个盒子,即存在一个\(A_i={x_i,y_i,z_i},A_j={x_j,y_j,z_j}\),使得\(x_i<x_j,y_i<y_j,z_i<z_j\)思路思考一个简单的问题:对于二元组\((x,y)\),我们怎么确定存在两......
  • ARC164 F
    先进行一些转化。每个点被翻转的次数固定,为其深度。(这里规定根节点的深度为\(0\))所以每个人放颜色可以看做放什么得什么,而不需要考虑翻转。先手选偶数层和后手选奇数层都会使得先手得分,反之不得分。所以先手和后手其实是一样的策略:尽可能选偶数层,而不选奇数层。对于能够放颜......
  • AtCoder Beginner Contest 309 G Ban Permutation
    洛谷传送门AtCoder传送门前置知识:[ARC132C]AlmostSorted看\(\geX\)不顺眼,怎么办呢!直接容斥!钦定\(j\)个位置满足\(|P_i-i|<X\),其余任意,就转化成了[ARC132C]AlmostSorted。具体一点就是,你设\(f_{i,j,S}\)表示前\(i\)位有\(j\)个位置满足\(|P_i-i|<......
  • atcoder绿题选做
    ABC305:E  https://atcoder.jp/contests/abc305/tasks/abc305_e题意:给定一个无向图,给定k个守卫,每个守卫有h[i]的耐力值,如果是一个在图中是被保护的要满足和守卫的距离至少为h[i],让你升序打印所有被守卫的点解题思路:可以从守卫出发,看守卫在可以走的情况下最远走到哪,最后统计......
  • Atcoder ABC308H Make Q
    考虑枚举唯一一个度数为\(3\)的点\(u\),即既在环上又与非环上一点相连的那个点。接下来考虑先处理环,那可以先把\(u\)从图上删掉,环的最短距离便是与\(u\)有连边的\(2\)个点在图上最短路长度加上\(2\)个点与\(u\)连边的长度,即\(\min\{w_{u,i}+w_{u,j}+\operator......
  • Atcoder ARC164B Switching Travel
    称\(c_u\not=c_v\)的边\((u,v)\)为普通边,\(c_u=c_v\)的边\((u,v)\)为特殊边。能发现若满足条件则这个环应该是由一条特殊边和若干条普通便组成的(从特殊边的一个顶点出发一直经过普通边,最后走到特殊边的另一个顶点再走回来)。于是若这个特殊边的两个顶点能只通过普通......
  • ARC164
    ARC164A考虑先给\(N\)按三进制分解一下然后对于\(3^m\rightarrow3^{m-1}\),实际上可以加\(2\)的贡献,我们先计算\(N\)最小需要\(S\)然后可以发现只要\(K-S\)是偶数即可#include<bits/stdc++.h>usingnamespacestd;signedmain(){//freopen("date.in","r",stdin);......