草庐IT

AtCoder Beginner Contest 290

~Lanly~ 2023-03-28 原文

A - Contest Result (abc290 a)

题目大意

给定\(n\)道题的分数。

现在小 \(A\)过了一些题,问他的分数是多少。

解题思路

模拟即可。

神奇的代码
#include <bits/stdc++.h>
using namespace std;
using LL = long long;

int main(void) {
    ios::sync_with_stdio(false); 
    cin.tie(0); cout.tie(0);
    int n, m;
    cin >> n >> m;
    vector<int> s(n);
    for(auto &i : s)
        cin >> i;
    int ans = 0;
    while(m--){
        int x;
        cin >> x;
        ans += s[x - 1];
    }
    cout << ans << '\n';

    return 0;
}



B - Qual B (abc290 b)

题目大意

一场比赛,按照排名依次给出每个人参加决赛的意愿(o x)。

最终只能晋级\(k\)个人。取意愿参加决赛的前 \(k\)人晋级。

问实际上每个人晋级决赛的情况。

解题思路

\(k\)o的保留,后面全部置为 x即可。

神奇的代码
#include <bits/stdc++.h>
using namespace std;
using LL = long long;

int main(void) {
    ios::sync_with_stdio(false); 
    cin.tie(0); cout.tie(0);
    int n, k;
    string s;
    cin >> n >> k >> s;
    for(auto &i : s){
        if (i == 'o' && k){
            -- k;
        }else if (i == 'o' && !k){
            i = 'x';
        }
    }
    cout << s << '\n';

    return 0;
}



C - Max MEX (abc290 c)

题目大意

给定一个\(n\)个数的数组,要求选\(k\)个数出来,使得其\(mex\)最大。

一个数组的\(mex\)值就是最小的,未出现在该数组的非负整数。

解题思路

为了让\(mex\)最大,很显然我们依次取 \(0,1,2,...\),且仅取一个,直到取了\(k\)个。

如果中途发现有个数取不到则答案就是该数,否则就是 \(k\)

神奇的代码
#include <bits/stdc++.h>
using namespace std;
using LL = long long;

int main(void) {
    ios::sync_with_stdio(false); 
    cin.tie(0); cout.tie(0);
    int n, k;
    cin >> n >> k;
    vector<int> s(n);
    for(auto &i : s)
        cin >> i;
    sort(s.begin(), s.end());
    int ans = 0;
    for(auto &i : s){
        if (k <= 0)
            break;
        if (ans > i)
            continue;
        else if (ans == i){
            ++ ans;
            -- k;
        }
        else if (ans < i)
            break;
    }
    cout << ans << '\n';

    return 0;
}



D - Marking (abc290 d)

题目大意

\(n\)个箱子。从 \(0\)开始涂色。每涂一个箱子\(i\)后,下一个涂的箱子编号是 \(i+D\) 。如果该箱子已经被涂色了,则涂编号为\(i+D+1\)的箱子,如果还被涂过则再 \(+1\),直到没涂过为止。

问第 \(k\)次涂的箱子编号。

解题思路

如果不考虑已经涂色的情况,即就算已经涂了,这次还继续涂,那第\(k\)次涂的箱子编号就是 \(kD \% n\)

由数论知识可知,当\(D\)\(n\)互质时,当 \(k\)取遍 \([0,n - 1]\)时, \(kD \% n\)也恰好的取遍了 \([0, n - 1]\),因此此时答案就是 \(kD \% n\)

而不互质时,设其\(D,n\)\(gcd\)\(a\),则\(kD \% n\)取到的数都是 \(a\)的倍数。

事实上,设\(D^\prime = \frac{D}{a}, n^\prime = \frac{n}{a}\),此时\(D^\prime, n^\prime\)互质,则第\(k\)取取到的数就是 \(kD^\prime\),而在模\(n\)的视角里就是 \(kD^\prime \times a\)。因为循环节大小只有 \(n^\prime\), 因此当\(k > n^\prime\)时,由题意的偏移操作,下一个的循环节就是原来的循环节整体加 \(1\)

因此最终的答案就是 \(kD^\prime \times a + \frac{k}{n^\prime}\)

神奇的代码
#include <bits/stdc++.h>
using namespace std;
using LL = long long;

int main(void) {
    ios::sync_with_stdio(false); 
    cin.tie(0); cout.tie(0);
    int t;
    cin >> t;
    while(t--){
        int k, d, n;
        cin >> n >> d >> k;
        -- k;
        int gcd = __gcd(d, n);
        d /= gcd;
        n /= gcd;
        int target = 1ll * k * d % n;
        target = target * gcd + (k / n);
        cout << target << '\n';
    }


    return 0;
}



E - Make it Palindrome (abc290 e)

题目大意

定义一个数组变成回文数组的代价,是其最小进行的操作数。每次操作可以将任意一个数更改为任意一个值。

给定一个\(n\)个数的数组,问其所有连续子数组的代价和。

解题思路

给定一个数组,考虑其变成回文数的代价。很显然我们只要遍历左半边的每个数,看其与对应的数是否相同,不相同则需要一个操作让它们变成相同。

从中我们可以发现,代价贡献来自于每一对数是否相同,以及包含这对数的子数组个数,因此我们的视角从考虑每个子数组转成考虑每对数。

假设当前考虑的是第\(i\)个数\(a_i\),依次考虑其右边的每一个数,很显然我们只考虑与\(a_i\)不同的那些数,相同的话对答案是没贡献的。

假设\(a_j \neq a_i(j > i)\),那么这对数\((a_i, a_j)\)会产生一个操作的贡献,但还得考虑有多少个子数组,回文包括 \((a_i,a_j)\)

最短的子数组当然是\(a[i,...,j]\),再大一点就是 \(a[i-1,...,j+1]\) 。因此子数组个数为 \(\min(i, n - j + 1)\)(下标从 \(1\)开始)

如果单纯只有不同数的个数,可以直接预处理,但这里还带了个系数\(\min(i, n - j + 1)\),且与 \(i\)有关,不好直接预处理。

因此我们得把 \(\min\)去掉,那就是将 \(i\)右边的数分成了两类,一类是 \(a_j \neq a_i\),且 \(\min(i, n - j + 1) = i\)\(j < n - i + 1\),另一类是 \(a_j \neq a_i\)\(\min(i, n - j + 1) = n - j + 1\)\(j \geq n - i + 1\)

  • 对于 \(i < j < n - i + 1\)的那些 \(a_j \neq a_i\),这些对 \((a_i, a_j)\)对答案的贡献都是 \(i\)。因此我们只要维护这个区间里非 \(a_i\)的个数 \(cnt\),这部份的贡献就是 \(cnt \times i\)
  • 对于 \(j > n - i + 1\)的那些 \(a_j \neq a_i\),这些对 \((a_i, a_j)\)对答案的贡献都是 \(n - j + 1\)。因此我们只要维护这个区间里非 \(a_i\)\(a_j \times (n - j + 1)\)的和,这部份的贡献就是该和。

维护区间非\(a_i\)的个数以及\(a_j \times (n - j + 1)\) 的和,可以维护所有数的个数与和,再减去\(a_i\)的贡献,即是非 \(a_i\)的个数与和。

当我们迭代求解每个\(a_i\)时,这两个区间信息可以迭代 \(O(1)\)更新,因此总的时间复杂度为 \(O(n)\)

神奇的代码
#include <bits/stdc++.h>
using namespace std;
using LL = long long;

int main(void) {
    ios::sync_with_stdio(false); 
    cin.tie(0); cout.tie(0);
    int n;
    cin >> n;
    vector<int> a(n);
    LL ans = 0;
    vector<LL> sum(n), cnt(n);
    LL suf = 0, tot = n;
    for(auto &i : a){
        cin >> i;
        -- i;
        cnt[i] ++;
    }
    for(int i = 0; i < n / 2; ++ i){
        tot -= 2;
        cnt[a[i]] --;
        cnt[a[n - i - 1]] --;

        sum[a[n - i - 1]] += i + 1;
        suf += i + 1;

        ans += 1ll * (i + 1) * (tot - cnt[a[i]]) + suf - sum[a[i]];
    }
    if (n & 1)
        ans += suf - sum[a[n / 2]];
    for(int i = (n + 1) / 2; i < n; ++ i){
        sum[a[i]] -= n - i;
        suf -= n - i;

        ans += suf - sum[a[i]];
    }
    cout << ans << '\n';

    return 0;
}



F - Maximum Diameter (abc290 f)

题目大意

给定一个长度为\(n\)的度数数组\(A\),定义 \(f(A)\)的值为满足该度数数组的树的最大直径长度。

对于所有可能的\(A\),求 \(f(A)\)的和。

解题思路

<++>

神奇的代码



G - Edge Elimination (abc290 g)

题目大意

<++>

解题思路

<++>

神奇的代码



Ex - Bow Meow Optimization (abc290 h)

题目大意

<++>

解题思路

<++>

神奇的代码



有关AtCoder Beginner Contest 290的更多相关文章

  1. FPGA解码4line MIPI视频 IMX291/IMX290摄像头采集 提供工程源码和技术支持 - 2

    目录1、前言2、Xilinx官方主推的MIPI解码方案3、我已有的MIPI解码方案4、纯Vhdl代码解码MIPI5、vivado工程介绍6、上板调试验证7、福利:工程代码的获取1、前言FPGA图像采集领域目前协议最复杂、技术难度最高的应该就是MIPI协议了,MIPI解码难度之高,令无数英雄竞折腰,以至于Xilinx官方不得不推出专用的IP核供开发者使用,不然太高端的操作直接吓退一大批FPGA开发者,就没人玩儿了。本文详细描述了设计方案,工程代码编译通过后上板调试验证,可直接项目移植,适用于在校学生做毕业设计、研究生项目开发,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的数字成像和图像

  2. ios - 线程警告 : ['Camera' ] took '290.006104' ms. 插件应使用后台线程 - 2

    我正在为IOS构建一个Phonegap应用程序。我使用Cordova相机plugin上传个人资料图片。我的示例代码是:navigator.camera.getPicture(that.imageDataSuccessCallback,that.imageDataErrorCallback,{quality:10,destinationType:1,encodingType:0,allowEdit:true,correctOrientation:true,sourceType:0});当我点击那个特定的按钮时,我会收到警告THREADWARNING:['Camera']took'290.

  3. 【LeetCode】第290场单周赛 --- 记录一次AK周赛 - 2

    🎄目录🌼写在前面🌻题1:6041.多个数组求交集🌷题目描述🌷解题思路🌷代码编写(Java版本)🌻题2:6042.统计圆内格点数目🌷题目描述🌷解题思路🌷代码编写(Java版本)🌻题3:6043.统计包含每个点的矩形数目🌷题目描述🌷思路一:二分搜索🌷思路二:二维偏序+树状数组🌻题4:6044.花期内花的数目🌷题目描述🌷思路一:排序+二分🌷思路二:排序💗写在最后🌼写在前面Hello朋友们😋,我是秋刀鱼🐟,一只活跃于Java区与算法区的新人博主~欢迎大家加入高校算法学习社区🏰:https://bbs.csdn.net/forums/Suanfa,社区里大佬云集,大家互相交流学习!今天给大家带来Leet

  4. 【LeetCode】第290场单周赛 --- 记录一次AK周赛 - 2

    🎄目录🌼写在前面🌻题1:6041.多个数组求交集🌷题目描述🌷解题思路🌷代码编写(Java版本)🌻题2:6042.统计圆内格点数目🌷题目描述🌷解题思路🌷代码编写(Java版本)🌻题3:6043.统计包含每个点的矩形数目🌷题目描述🌷思路一:二分搜索🌷思路二:二维偏序+树状数组🌻题4:6044.花期内花的数目🌷题目描述🌷思路一:排序+二分🌷思路二:排序💗写在最后🌼写在前面Hello朋友们😋,我是秋刀鱼🐟,一只活跃于Java区与算法区的新人博主~欢迎大家加入高校算法学习社区🏰:https://bbs.csdn.net/forums/Suanfa,社区里大佬云集,大家互相交流学习!今天给大家带来Leet

  5. AtCoder Beginner Contest 290 - 2

    A-ContestResult(abc290a)题目大意给定\(n\)道题的分数。现在小\(A\)过了一些题,问他的分数是多少。解题思路模拟即可。神奇的代码#includeusingnamespacestd;usingLL=longlong;intmain(void){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);intn,m;cin>>n>>m;vectors(n);for(auto&i:s)cin>>i;intans=0;while(m--){intx;cin>>x;ans+=s[x-1];}coutB-QualB(abc290b)题

  6. AtCoder Beginner Contest 290 - 2

    A-ContestResult(abc290a)题目大意给定\(n\)道题的分数。现在小\(A\)过了一些题,问他的分数是多少。解题思路模拟即可。神奇的代码#includeusingnamespacestd;usingLL=longlong;intmain(void){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);intn,m;cin>>n>>m;vectors(n);for(auto&i:s)cin>>i;intans=0;while(m--){intx;cin>>x;ans+=s[x-1];}coutB-QualB(abc290b)题

随机推荐