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

AtCoder Beginner Contest 333

时间:2023-12-19 18:48:16浏览次数:26  
标签:AtCoder Beginner int cin 333 long tie 节点 define




B - Pentagon

难度: ⭐

题目大意

给定一个正五边形, 其顶点为ABCDE; 给定端点a, b, c, d; 问a, b之间的距离和c, d之间的距离是否相等;

解题思路

两个端点之间的距离就看两个端点之间隔了几条边就行; 并且因为是五边形, 隔x条边和隔5-x条边是等价的;

神秘代码

#include<bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define endl '\n'
using namespace std;
const int N = 1e6 + 10, mod = 998244353;
typedef pair<int, int> PII;
int n, m, k;
signed main() {
    char a, b, c, d;
    cin >> a >> b >> c >> d;
    int d1 = abs(a - b);
    int d2 = abs(c - d);
    if(d1 == d2 || d1 + d2 == 5) cout << "Yes";
    else cout << "No";
    return 0;
}




C - Repunit Trio

难度: ⭐

题目大意

定义一个数列是由{1, 11, 111, 1111...}组成, 从中选择3个数相加(可以重复), 可以再得到一个数列; 问这个数列中第n小的数是多少;

解题思路

因为n最大为333, 由样例可得是一个12位的数; 那么我们可以之间三重循环暴力即可;

神秘代码

#include<bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define endl '\n'
using namespace std;
const int N = 1e6 + 10, mod = 998244353;
typedef pair<int, int> PII;
int n, m, k;
set<int> s;
int idx = 111111111111;
signed main() {
    cin >> n;
    for(int i = 1; i <= idx; i = i * 10 + 1){
        for(int j = i; j <= idx; j = j * 10 + 1){
            for(int h = j; h <= idx; h = h * 10 + 1){
                s.insert(i + j + h);
            }
        }
    }
    auto p = s.begin();
    for(int i = 1; i < n; i++) p++;
    cout << *p;
    return 0;
}




D - Erase Leaves

难度: ⭐⭐⭐

题目大意

给定一个无向树, 我们可以进行如下操作: 选择其中一个叶子节点并且删除它, 也就是把与该叶子节点的边删除; 问我们最少进行多少次操作后可以删除节点1;

解题思路

这题就是问需要进行多少次操作后可以让节点1变成叶子节点; 我们可以把1看作根节点, 设它有n个子树, 那么我们需要删除其中(n-1)个子树才可以让其变成叶子节点, 所以我们可以找出节点数最多的一个子树, 删除除了它之外的所有子树即可; 因为有3e5个节点, 我担心dfs会爆栈, 所以就没用递归, 而是采用kruskal的思想, 用边来遍历每个节点; 每个子树都可以看作一个连通块, 用并查集来维护每个连通块的节点数量即可;

神秘代码

#include<bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define endl '\n'
using namespace std;
const int N = 3e5 + 10, mod = 998244353;
typedef pair<int, int> PII;
int n, m, k;
vector<int> v;
int p[N];
map<int,int> mp;
int find(int x){
    if(p[x] != x) p[x] = find(p[x]);
    return p[x];
}
signed main() {
    cin >> n;
    for(int i = 1; i <= n; i++) p[i] = i;
    for(int i = 1; i < n; i++){
        int a, b;
        cin >> a >> b;
        if(a != 1 && b != 1){
            if(find(a) != find(b)){
                p[find(b)] = find(a);
            }
        }
    }
    int maxn = 0;
    for(int i = 2; i <= n; i++){
        mp[find(i)]++;
        maxn = max(maxn, mp[find(i)]);
    }
    cout << n - maxn;
    return 0;
}




E - Takahashi Quest

难度: ⭐⭐⭐

题目大意

现在有一个长度为n的走廊, 每个格子都随机产生一个武器或者怪兽, 注意小莫同时拥有多种武器; 其属性为(x, y); 如果x为1, 则是武器, 为2, 则是怪兽; 只有y类的武器才能击败y类的怪兽; 设k是整个过程中某个时刻小莫拥有武器的最大数量; 请问在通关的前提下, k的最小值是多少, 并且给出所有武器的拾取情况, 1是拾取, 2是不拾取;

解题思路

既然要求小莫要尽量少地积累武器, 所以我们拾取武器后要尽快的用出去, 尽量不要累计; 所以基础策略就是对于一个怪兽, 我们要拾取距离其最近的武器来对付; 我们可以用一个数组p[y]表示当前最靠前的y类武器在第几个格子; 设第i个格子上的武器种类是y, 那么pre[i]表示距离i最近的武器种类为y的位置在第几个格子; 这样我们就可以用p[y]和pre[i]来实现对应武器位置的定位;
当第i个位置的武器种类为b, 那么更新方式为pre[i] = p[b]; p[b] = i;
当第i个位置的怪兽种类为b, 那么更新方式为p[b] = pre[p[b]];
而对于k的数量, 我们直接遍历这n个格子, 如果拾取该武器就+1, 如果遇到怪兽就-1, 每次都更新一下最大值即可;

神秘代码

#include<bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define endl '\n'
using namespace std;
const int N = 2e5 + 10, mod = 998244353;
typedef pair<int, int> PII;
int n, m, k;
int p[N], mk[N], pre[N];
bool st[N];
signed main() {
    cin >> n;
    for(int i = 1; i <= n; i++){
        int a, b;
        cin >> a >> b;
        mk[i] = a;
        if(a == 1){
            pre[i] = p[b];
            p[b] = i;
        }
        else {
            if(p[b]) {
                st[p[b]] = true;
                p[b] = pre[p[b]];
            }
            else {
                cout << -1;
                return 0;
            }
        }
    }
    int maxn = 0, x = 0;
    for(int i = 1; i <= n; i++){
        if(mk[i] == 1 && st[i]) x++;
        else if(mk[i] == 2) x--;
        maxn = max(maxn, x);
    }
    cout << maxn << endl;
    for(int i = 1; i <= n; i++){
        if(mk[i] == 1){
            if(st[i]) cout << 1 << ' ';
            else cout << 0 << ' ';
        }
    }
    return 0;
}




F - Bomb Game 2

难度: ⭐⭐⭐⭐

标签:AtCoder,Beginner,int,cin,333,long,tie,节点,define
From: https://www.cnblogs.com/mostimali/p/17914408.html

相关文章

  • Atcoder ABC 333 题解(A - F)
    ABC不讲D待更E待更F设$f(i,j)$为有$i$个人时,第$j$个人活到最后的概率,显然:\[f(i,j)=\begin{cases}1,&i=1,j=1\\\frac{1}{2}f(i,i),&i\neq1,j=1\\\frac{1}{2}f(i,j-1)+\frac{1}{2}f(i-1,j-1),&i\neq1,2\lej......
  • AtCoder Beginner Contest 324
    C-ErrorCorrection大意是:给定一个字符串a,以及一组字符串,如果字符串与a满足以下之一即可我写的有点麻烦。。#include<bits/stdc++.h>usingnamespacestd;voidsolve(){ intn; cin>>n; strings; cin>>s; vector<int>ans; for(inti=1;i<=n;i++){ stringt; ci......
  • CF333D 另一种做法
    前言duel的时候做的题,做出来的时候感觉很神,看了题解做法感觉自己是个傻逼。本做法时间复杂度是\(O(n^{\tfrac{5}{2}})\),可以作为补充了解。题解一个矩阵四个角的最大值有点烦,我们把它们排序,从小到大依次插入,则问题变为:在\(n\timesm\)的平面中,每次插入一个点,求在什么时候......
  • 为什么EmbeddedLinuxBeginnerSGuide的image中 uboot一定要放在fat32分区,不能跟preload
    按照按照  (https://rocketboards.org/foswiki/Documentation/EmbeddedLinuxBeginnerSGuide)制作了一个image,然后按照https://www.cnblogs.com/DoreenLiu/p/17903782.html将相关文件都打包到一个.img文件里面去。其实最开始研发给我的Makefile内容是这样(这个是RD用于制作LXD......
  • 【题解】AtCoder agc065_a Shuffle and mod K
    传送门:https://atcoder.jp/contests/agc065/tasks/agc065_a 为了方便理解,我们把要求的东西乘一个$-1$,再把答案序列倒过来;也就是说,我们现在要求$min_{A'}^{A'为A的排列}(\sum_{i=1}^{N-1}((A_{i+1}-A_{i})$$mod$$K))$比较显然的是,如果我们确定了答案序列的第一个数是多......
  • Toyota Programming Contest 2023#8(AtCoder Beginner Contest 333)
    ToyotaProgrammingContest2023#8(AtCoderBeginnerContest333)A-ThreeThrees代码:#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintN=1e6+10;typedefpair<ll,ll>pii;#definefifirst#definesesecondvoid......
  • 题解 ABC333F【Bomb Game 2】
    来个可能有点麻烦但不用动脑子的暴力做法。直接设\(f_{i,j}\)表示有\(i\)个人时,第\(j\)个人幸存的概率。显然有\(f_{1,1}=1\)。对于\(i>1\),分类讨论容易得到:\[f_{i,j}=\begin{cases}\frac{f_{i,n}}{2},&j=1\\\frac{f_{i-1,j-1}+f_{i,j-1}}{2},&1<j\lei\\\e......
  • AtCoder Beginner Contest 325
    C-Sensors但看数据发现是经典油田问题,直接dfs#include<bits/stdc++.h>usingnamespacestd;intn,m;intdx[8]={-1,-1,-1,0,1,1,1,0};intdy[8]={-1,0,1,1,1,0,-1,-1};intvis[1005][1005];charmp[1005][1005];voiddfs(intx,inty){ vis[x][y]=......
  • AtCoder Beginner Contest 332
    C-T-shirts题意是:给定一个string,字符代表每天有不同的事,做不同的事会穿不同的衣服,问你最少需要准备多少T恤。思路:贪心,能不用T恤就不要T恤#include<bits/stdc++.h>usingnamespacestd;voidsolve(){ intn,k; cin>>n>>k; strings; cin>>s; intans=0; intcnt=k; i......
  • AT_abc333_e [ABC333E] Takahashi Quest 题解
    AT_abc333_e[ABC333E]TakahashiQuest题解思路解析可以发现一瓶药水无论什么时候拿被使用掉的时间都是不会变的,所以如果我们想让一瓶药水再背包里待得时间尽可能的短就要让它尽可能的被晚拿起来,于是我们就可以想到使用栈存下每一瓶同类的药水分别出现的时间,此时每遇到一只怪......