首页 > 其他分享 >AtCoder Beginner Contest(abc) 329

AtCoder Beginner Contest(abc) 329

时间:2023-11-19 11:57:01浏览次数:30  
标签:AtCoder abc cout idx int long st 329 define




B - Next

难度: ⭐

题目大意

给定n个数, 输出其去重后的次大值;

解题思路

暴力就行;

神秘代码

#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;
typedef pair<int, int> PII;
int n, m;
int a = -1, b = -1;
signed main(){
    cin >> n;
    for(int i = 1; i <= n; i++){
        int x;
        cin >> x;
        if(x > a){
            b = a;
            a = x;
        }
        else if(x > b && x != a){
            b = x;
        }
    }
    cout << b;
    return 0;
}




C - Count xxx

难度: ⭐⭐

题目大意

给定一个字符串, 问其中有多少种由同一个字母组成的连续子串; eg: a bbb cc

解题思路

因为要考虑去重, 我们可以直接记录每种字母最长的连续子串的长度即可, 其数量就是该长度;
注意: 我第一想法是暴力扫一遍然后用set把所有满足条件的子串存起来; 但是我没意识到, set对于字符串的排序和去重也是需要遍历该字符串的, 所以对于string类型的set, 它的所有操作复杂度
是O(nmlogn), m是字符串的长度, 所以会TLE;

神秘代码

#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;
typedef pair<int, int> PII;
int n, m, idx;
int d[N];
signed main(){
    string s;
    cin >> n >> s;
    string str = "";
    int idx = 1;
    for(int i = 1; i < s.size(); i++){
        if(s[i] == s[i - 1]) idx++;
        else{
            int x = s[i - 1] - 'a';
            d[x] = max(d[x], idx);
            idx = 1;
        }
    }
    d[s[s.size() - 1] - 'a'] = max(d[s[s.size() - 1] - 'a'], idx);
    int res = 0;
    for(int i = 0; i < 26; i++){
        res += d[i];
    }
    cout << res;
    return 0;
}




D - Election Quick Report

难度: ⭐⭐

题目大意

一场选举有n个候选人; 一共有m张选票; 挨个展示每张选票, 并且同步输出当前选票数量最多的候选人是谁, 如果票数相同, 就输出编号小的那位;

解题思路

只需要设置两个变量x和y来维护展示第i张选票前票数最多人是谁, 他的票数是多少; 每次更新时, 如果当前这个人满足条件, 那么就更新x; 否则就还是输出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 = 2e5 + 10;
typedef pair<int, int> PII;
int n, m, idx;
int maxn = 0, v;
int d[N];
signed main(){
    cin >> n >> m;
    for(int i = 1; i <= m; i++){
        int x;
        cin >> x;
        d[x]++; 
        if(d[x] > maxn){
            maxn = d[x];
            v = x;
        }
        else if(d[x] == maxn){
            if(x < v) v = x;
        }
        cout << v <<endl;
    }
    return 0;
}




E - Stamp

难度: ⭐⭐⭐⭐

题目大意

给定两个字符串S和T, 长度分别为n和m; 以及一个空的字符串C, 长度也是n; 我们可以用字符串T去构造字符串C: 在字符串C中选择m个连续的位置, 然后用字符串T去覆盖这个m个位置; 注意是覆盖, 如果这m个位置之前已经有字符了也会被覆盖为新的; 请问是否可以把C构造为S;

解题思路

待补...

神秘代码

待补...




F - Good Set Query

难度: ⭐⭐⭐

题目大意

现在有n个箱子, 初始每个箱子都有一个颜色为x的球; 现在有m次操作, 每次把a箱子的球倒进b箱子, 然后输出b箱子中有多少种颜色的球;

解题思路

为了去重我们考虑用set来维护每个箱子种球的颜色数量; 本题的关键是要用树上启发式合并来进行两个箱子的合并, 朴素的合并会TLE; 树上启发式合并也很简单, 就是当我们要合并两个箱子时, 我们要选择把球数少的箱子倒进球数多的箱子, 而不是反过来, 这是一种直觉性的算法; 但是题目已经要求了a和b的倒入顺序, 所以如果要进行启发式合并, 那么可能需要互换箱子的编号, 所以我们就得另开一个数组, 表示set[i]的i表示第几个箱子;

神秘代码

#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;
typedef pair<int, int> PII;
int n, m, idx;
set<int> st[N];
int id[N];
signed main(){
    cin >> n >> m;
    for(int i = 1; i <= n; i++){
        int x;
        cin >> x;
        st[i].insert(x);
    }
    for(int i = 1; i <= n; i++) id[i] = i;
    while(m--){
        int a, b, a1, b1;
        cin >> a >> b;
        a1 = id[a], b1 = id[b];
        if(st[a1].size() < st[b1].size()){
            for(int x : st[a1]){
                st[b1].insert(x);
            }
            st[a1].clear();
        }
        else {
            for(int x : st[b1]){
                st[a1].insert(x);
            }
            st[b1].clear();
            swap(id[a], id[b]);
        }
        cout << st[id[b]].size() << endl;
    }
    return 0;
}

标签:AtCoder,abc,cout,idx,int,long,st,329,define
From: https://www.cnblogs.com/mostimali/p/17841788.html

相关文章

  • [ABC326D] ABC Puzzle 题解
    题目链接解法分析这个问题是一个经典的排列谜题,通过回溯算法来穷举所有可能的字符排列,然后验证是否满足行和列约束。这个解决方案可以用于解决类似的谜题,其中需要满足一定的排列条件。通过仔细考虑约束条件,可以加快解决问题的速度,减少不必要的计算。更详细的我写在代码里了。......
  • AtCoder Beginner Contest(abc) 296
    B-Chessboard难度:⭐题目大意给定一个8*8的字符矩阵,其中只有一个'*',输出它的坐标;其坐标的列用字母表示,行用数字表示,具体看样例解释;解题思路签到题不多嗦了;神秘代码#include<bits/stdc++.h>#defineintlonglong#defineIOSios::sync_with_stdio......
  • AtCoder Beginner Contest 328
    B-11/11题意是:有n个月份,要你计算出月份上的每个数位与对应月份中的每个日期数位一致的日期和直接模拟即可usingnamespacestd;inta[200];intp;boolcheck(intx){ p=x%10; x/=10; while(x){ intq=x%10; if(q!=p)returnfalse; x/=10; } returntrue;}boo......
  • Atcoder 中高分段 选做 与 ARC vp
    开坑,主推红题和铜牌题,来源乱七八糟,目前一部分来自学校给的。一眼秒了标绿,想了很久或是接受了提示标蓝,看了题解或者认为题很难标红。意义重大标星。很主观(然后发现其实基本上大多数题都不会,狠狠地难过了)。以后有时间可能会开始板刷ARC,现在,还是,慢慢来吧。upd-2023-10-30:和Eray......
  • 【题解 ABC180F】 Unbranched
    [ABC180F]Unbranched题面翻译求\(N\)个点,\(M\)条边且满足以下条件的图的数量:图中无自环;每个点度数最多为\(2\);连通块大小的最大值恰好为\(L\)。答案对\(10^9+7\)取模。\(2\leN\le300\),\(1\leM,L\leN\)。题目描述頂点にラベルが付き辺にはラベルが付い......
  • [ABC288D] Range Add Query
    先考虑将原序列差分一下,事实上,我们对于这类每次可以操作一个区间减去固定值的时候,我们一般都需要差分,因为差分后,我们的操作实际上相当于**在差分序列上修改两个点**,这个时候的问题是好考虑的。这时候问题转化为,我们每次可以选择两个距离恰好为$k+1$的点,将$l$加上$w$,将$l......
  • AtCoder Beginner Contest(abc) 324
    B-3-smoothNumbers难度:⭐题目大意给定一个数字n,问是否可以找到两个数x和y,使得n=2x3y;解题思路因为n的范围最大到1e18,所以只需要暴力找x和y即可;神秘代码#include<bits/stdc++.h>#defineintlonglong#defineIOSios::sync_with_stdio(false),cin.......
  • abc280F - Pay or Receive(判断是否全为零环)
    https://atcoder.jp/contests/abc280/tasks/abc280_f对于每一个连通块单独处理,首先判断是否全为0环,可以用bfs判断。从一个点出发计算其他点到它的最短距离,如果存在一个不唯一,说明存在非零环。然后计算距离的时候直接-d[x]+d[y]即可#include<cstdio>#include<algorithm>#incl......
  • abc327F - Apples(线段树)
    https://atcoder.jp/contests/abc327/tasks/abc327_f我们将时间看作x轴,位置看作y轴,那么我们随着时间增加,维护新加的点对区间的贡献,同时减去过时的点,线段树区间加法维护最大值即可。#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#include<map>#incl......
  • 2023-2024-1 20231329《计算机基础与程序设计》第8周学习总结
    作业信息这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK08这个作业的目标计算机科学概论第9章并完成云班课测试《C语言程序设计》第7章并完成云班课测试作......