首页 > 其他分享 >HUAWEI Programming Contest 2024(AtCoder Beginner Contest 342)

HUAWEI Programming Contest 2024(AtCoder Beginner Contest 342)

时间:2024-02-25 17:44:34浏览次数:25  
标签:AtCoder Beginner Contest int ll long pair using define

HUAWEI Programming Contest 2024(AtCoder Beginner Contest 342)

A - Yay!

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<ll, ll>;
#define fi first
#define se second
using i128 = __int128_t;
using piii = pair<ll, pair<ll, ll>>;

void solve()
{
    string s;
    cin >> s;
    int n = s.size();
    vector<int> cnt(30), pos(30);
    for (int i = 0; i < n; i++)
    {
        cnt[s[i] - 'a']++;
        pos[s[i] - 'a'] = i + 1;
    }
    for (int i = 0; i < 26; i++)
    {
        if (cnt[i] == 1)
        {
            cout << pos[i] << endl;
            return;
        }
    }
}

int main()
{
    int t = 1;
    // cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

B - Which is ahead?

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<ll, ll>;
#define fi first
#define se second
using i128 = __int128_t;
using piii = pair<ll, pair<ll, ll>>;

void solve()
{
    int n;
    cin >> n;
    vector<int> a(n + 1), pos(110);
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        pos[a[i]] = i;
    }
    int q;
    cin >> q;
    while (q--)
    {
        int l, r;
        cin >> l >> r;
        if (pos[l] < pos[r])
        {
            cout << l << endl;
        }
        else
        {
            cout << r << endl;
        }
    }
}

int main()
{
    int t = 1;
    // cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

C - Many Replacement

解题思路:

每次变换,\(26\)个字母一个个看。

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<ll, ll>;
#define fi first
#define se second
using i128 = __int128_t;
using piii = pair<ll, pair<ll, ll>>;

void solve()
{
    int n;
    cin >> n;
    string s;
    cin >> s;
    int q;
    cin >> q;
    vector<char> f(40);
    for (int i = 0; i < 26; i++)
    {
        char c = i + 'a';
        f[i] = c;
    }
    while (q--)
    {
        char a, b;
        cin >> a >> b;
        for (int i = 0; i < 26; i++)
        {
            if (f[i] == a)
            {
                f[i] = b;
            }
        }
    }
    for (auto c : s)
    {
        cout << f[c - 'a'];
    }
    cout << endl;
}

int main()
{
    int t = 1;
    // cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

D - Square Pair

解题思路:

\(cnt[i]:表示在序列A中, 指数为奇数的质因子的乘积为i,这样的数字的个数。\)

平方数的质因子指数都是偶数。

对于两个平方数而言,相乘还是平方数。他们指数为奇数的质因子个数为零。

对于两个非平方数,只有他们指数为奇数的质因子相乘起来,这些质因子指数变为偶数才会变为平方数。由于奇数加奇数一定为偶数,我们不用记录指数具体是多少,只要记录其奇偶性即可。

最后计数时,\(0\)不止和自己可以组合,它还可以和任何其他数组合。

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<ll, ll>;
#define fi first
#define se second
using i128 = __int128_t;
using piii = pair<ll, pair<ll, ll>>;

void solve()
{
    int n;
    cin >> n;
    vector<ll> a(n + 1);
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
    }
    vector<ll> primes, minp(2e5 + 10);
    for (int i = 2; i <= 2e5; i++)
    {
        if (!minp[i])
        {
            minp[i] = i;
            primes.push_back(i);
        }
        for (auto p : primes)
        {
            if (i * p > 2e5)
            {
                break;
            }
            minp[i * p] = p;
            if (i % p == 0)
            {
                break;
            }
        }
    }
    vector<ll> cnt(2e5 + 10);
    // 平方数的质因子指数都是偶数。
    for (int i = 1; i <= n; i++)
    {
        if (a[i] == 0)
        {
            cnt[a[i]]++;
            continue;
        }
        // 只留下指数为奇数的质因子,奇数加奇数为偶数
        for (auto p : primes)
        {
            if (p * p > a[i])
            {
                break;
            }
            while (a[i] % (p * p) == 0)
            {
                a[i] /= p * p;
            }
        }
        cnt[a[i]]++;
    }
    ll ans = 0;
    ll res = 0;
    for (int i = 1; i <= 2e5; i++)
    {
        ans += cnt[i] * (cnt[i] - 1) / 2;
        res += cnt[i];
    }
    ans += cnt[0] * (cnt[0] - 1) / 2;
    // 这里特例,0和任何数相乘都是平方数
    ans += cnt[0] * res;
    cout << ans << endl;
}

int main()
{
    int t = 1;
    // cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

E - Last Train

解题思路:

从点\(N\)开始跑最长路。

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<ll, ll>;
#define fi first
#define se second
using i128 = __int128_t;
using piii = pair<ll, pair<ll, ll>>;
const ll inf = 1ll << 60;
void solve()
{
    int n, m;
    cin >> n >> m;
    vector<vector<array<ll, 5>>> e(n + 10, vector<array<ll, 5>>());
    for (int i = 1; i <= m; i++)
    {
        ll l, d, k, c, a, b;
        cin >> l >> d >> k >> c >> a >> b;
        e[b].push_back({a, l, d, k, c});
    }
    vector<ll> dist(n + 10, -1);
    priority_queue<pii> q;
    q.push({inf, n});
    while (q.size())
    {
        auto [ds, u] = q.top();
        q.pop();
        if (dist[u] != -1)
        {
            continue;
        }
        dist[u] = ds;
        for (auto [v, l, d, k, c] : e[u])
        {
            // 减去路途时间
            ll t = ds - c;
            if (t >= l)
            {
                // 最晚出发时间
                t = l + min((k - 1), (t - l) / d) * d;
                q.emplace(t, v);
            }
        }
    }
    for (int i = 1; i < n; i++)
    {
        if (dist[i] == -1)
        {
            puts("Unreachable");
        }
        else
        {
            cout << dist[i] << "\n";
        }
    }
}

int main()
{
    int t = 1;
    // cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

标签:AtCoder,Beginner,Contest,int,ll,long,pair,using,define
From: https://www.cnblogs.com/value0/p/18032658

相关文章

  • Atcoder Beginner Contest 342 全题解
    A-Yay!题意给定字符串\(s\)已知该字符串中只有一个字符与其他字符不同求这个字符思想开一个数组\(cnt_i\)来记录\(s\)中每个字符出现的次数,一个数组\(first_i\)来记录\(s\)中每个字符第一次出现的下标。选择\(cnt_i=1\)的\(i\)输出\(first_i\)......
  • AtCoder Beginner Contest 342
    A-Yay!(abc342A)题目大意给定一个字符串,两个字符,其中一个只出现一次,找出它的下标。解题思路看第一个字符出现次数,如果是\(1\)则就是它,否则就是不是它的字符。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;intmain(void){io......
  • Atcoder ABC 342 全题解
    闲话当我还是一个只会AB的小蒟蒻时,由于不会C又看不懂官方题解,只好看网上的题解。结果:ABC签到题不讲AB对着题意模拟即可。A有个好玩的做法,先看前两个,如果不同跟第三个比较,如果相同看后面哪个字母跟第一个不一样。C由于是将所有的$c_i$替换,所以可得同一个字母最......
  • AtCoder WTF 2019 B Multiple of Nine/南外集训 2024.2.23 T1
    给定\(q\)个区间\(\{[l_i,r_i]\}\),计算满足条件的长度为\(n\)的十进制数码串\(S\)的个数\(\bmod10^9+7\):\(\foralli\in[1,q],num(S[l_i,r_i])\equiv0\pmod9\)。其中\(num(T)\)表示数码串\(T\)代表的整数,\(T[a,b]\)表示子串\(T_aT_{a+1}\dotsT_b\)......
  • solution-div2contest-D
    题面可以在link看到?大力手玩题!场切了!首先看到这种题,我们一定是先想给定一个树怎么求他的最大独立集。我忘记怎么贪心了,于是考虑DP,设\(f_{u,0/1}\)表示以\(u\)为根的子树中独立集包含或不包含\(u\)这个点的最大独立集大小。转移是显然的,为了下文讲解方便还是在这里写出......
  • 山海经&&Atcoder Alternating String (线段树)
    前言:为什么把他们放在一起?因为我发现把pushup向上回溯放结构体类型函数里比较方便并且这两题确实也有相同思想山海经这题分三种情况左子树前缀和+右子树前缀和2.右子树后缀和与右总区间+左子树3.左区间最大子段与右区间最大子段与左后缀与右前缀特别要注意......
  • Toyota Programming Contest 2024#2(AtCoder Beginner Contest 341)
    ToyotaProgrammingContest2024#2(AtCoderBeginnerContest341)A-Print341代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=pair<ll,ll>;#definefifirst#definesesecondusingi128=__int128_t;usingp......
  • AtCoder Beginner Contest 339
    B-Langton'sTakahashi难度:⭐⭐题目大意给定一个n*m的网格,并且每一行和每一列都是首尾相连的,每行的最后一个格子再往右就是这行的第一个格子,第一个格子向左就是最后一个格子;列也同理;默认每个格子初始为白色;小莫位于(1,1),方向朝上;当小莫位于某个格子......
  • USACO 2024 February Contest, Bronze Problem 1. Palindrome Game
    1.猜结论2.证明如果\(s<=9\)则\(Bessie\)必赢。如果\(s=10\)则\(Elsie\)必赢。如果\(10<s<=19\)则\(Bessie\)可以减去\(s-10\),使自己必赢。如果\(s=20\)则\(Bessie\)无论如何减去一个回文数都会离\(10\)差一个个位数,\(Elsie\)减去这个个位......
  • CF1295F - Good Contest
    题意:\(a_i\)​是在\([l_i​,r_i]\)上均匀随机分布的整数,求\(a_{1\dotsn}\)​单调不增的概率。对\(998244353\)取模。\(2\len\le50,0\lel_i\ler_i\le998244351\)。首先可以把概率转化为总方案数在除以\(\prodr_i-l_i+1\),考虑出朴素的dp,设\(f_{i,j}\)为$选......