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

AtCoder Beginner Contest 345

时间:2024-03-19 20:23:32浏览次数:21  
标签:AtCoder const Beginner int vi cin long 345 using

A - Leftrightarrow

#include <bits/stdc++.h>

using namespace std;

using i32 = int32_t;
using i64 = long long;
using ldb = long double;

#define int long long

using vi = vector<int>;
using pii = pair<int, int>;

const int mod = 1e9 + 7;
const int inf = 1e18;

i32 main() {
    ios::sync_with_stdio(false), cin.tie(nullptr);
    string s;
    cin >> s;
    if (s.front() == '<' and s.back() == '>' and s.substr(1, s.size() - 2) == string(s.size() - 2, '=')) {
        cout << "Yes\n";
    } else {
        cout << "No\n";
    }
    return 0;
}

B - Integer Division Returns

#include <bits/stdc++.h>

using namespace std;

using i32 = int32_t;
using i64 = long long;
using ldb = long double;

#define int long long

using vi = vector<int>;
using pii = pair<int, int>;

const int mod = 1e9 + 7;
const int inf = 1e18;

i32 main() {
    ios::sync_with_stdio(false), cin.tie(nullptr);
    int x;
    cin >> x;
    if(x > 0 ) cout << ( x + 9 ) / 10 << "\n";
    else cout << x / 10 << "\n";
    return 0;
}

C - One Time Swap

#include <bits/stdc++.h>

using namespace std;

using i32 = int32_t;
using i64 = long long;
using ldb = long double;

#define int long long

using vi = vector<int>;
using pii = pair<int, int>;

const int mod = 1e9 + 7;
const int inf = 1e18;

i32 main() {
    ios::sync_with_stdio(false), cin.tie(nullptr);
    map<char, int> cnt;
    string s;
    cin >> s;
    for (auto i: s) cnt[i]++;
    int sum = s.size(), res = 0, f = 0;
    for (auto i: s) {
        sum--, cnt[i]--;
        res += sum - cnt[i], f |= cnt[i] > 0;
    }
    cout << res + f << "\n";
    return 0;
}

D - Tiling

可以直接暴搜,但是暴搜也是要有一些技巧

#include <bits/stdc++.h>

using namespace std;

using i32 = int32_t;
using i64 = long long;
using ldb = long double;

using vi = vector<int>;
using pii = pair<int, int>;

const int mod = 998244353;
const int inf = 1e18;

const vi dx = {0, 0, 1, -1}, dy = {1, -1, 0, 0};

i32 main() {
    ios::sync_with_stdio(false), cin.tie(nullptr);
    int n, h, w;
    cin >> n >> h >> w;
    vi a(n), b(n);
    for (int i = 0; i < n; i++) cin >> a[i] >> b[i];
    vector f(h, vi(w));
    vi vis(n);
    auto dfs = [&](auto self, int x, int y) -> void {
        if (x == h) {
            cout << "Yes\n";
            exit(0);
        }
        if (y == w) return self(self, x + 1, 0);
        if (f[x][y]) return self(self, x, y + 1);
        for (int i = 0; i < n; i++) {
            if (vis[i]) continue;
            vis[i] = 1;
            for (int t = 0, ok; t < 2; t++) {
                swap(a[i], b[i]);
                if( x + a[i] > h or y + b[i] > w ) continue;
                ok = 1;
                for (int u = 0; ok and u < a[i]; u++)
                    for (int v = 0; ok and v < b[i]; v++)
                        if (f[x + u][y + v]) ok = 0;
                if (not ok) continue;
                for (int u = 0; u < a[i]; u++)
                    for (int v = 0; v < b[i]; v++)
                        f[x + u][y + v] = 1;
                self(self, x, y + 1);
                for (int u = 0; u < a[i]; u++)
                    for (int v = 0; v < b[i]; v++)
                        f[x + u][y + v] = 0;
            }
            vis[i] = 0;
        }
    };
    dfs(dfs, 0, 0);
    cout << "No\n";
    return 0;
}

E - Colorful Subsequence

有 \(N\) 个球,每一个球有一个颜色 \(C_i\) 和价值 \(V_i\),现在要删除其中的 \(K\) 个球,使得剩下的球没有相邻的两个球颜色相等。求剩下的球的最大价值总和。

设\(f[i][j]\)表示为前\(i\)个球删掉\(j\)个且钦定保留第\(i\)个球的最大价值总和。

假设剩下\(s\)个球,则$s = i - j \(,显然可以得到\)s\le i \le s + k\(,如果我们枚举出了\)i,s$就可以得到转移

\[f[i][i-s] = \max_{s \le p \le i, C_p\ne C_i}(f[p-1][p-s]) + v[i] \]

比如我们枚举出了\(i=4,s=1\),则我们要求的就是\(f[4][3]=\max(f[3][3] , f[2][2], f[1][1],f[0][0]) + v[4]\)

所以其实我们可以统计出前缀最大值,以及与前缀最大值不同的前缀次大值的,然后根据颜色是否相同判断选择那个即可。

#include <bits/stdc++.h>

using namespace std;

using i32 = int32_t;
using i64 = long long;
using ldb = long double;

#define int long long

using vi = vector<int>;
using pii = pair<int, int>;

const int mod = 998244353;
const int inf = 1e18;

const vi dx = {0, 0, 1, -1}, dy = {1, -1, 0, 0};

i32 main() {
    ios::sync_with_stdio(false), cin.tie(nullptr);
    int n, k;
    cin >> n >> k;
    vi C(n + 2), V(n + 2);
    for (int i = 1; i <= n; i++) cin >> C[i] >> V[i];
    C[0] = n + 1, C[n + 1] = n + 2;
    n += 2;
    vector f(n, vi(k + 1, -inf));
    f[0][0] = 0;
    for (int s = 1; s <= n - 1 - k; s++) {
        pii mx[2] = {{-inf, 0},// 最大值
                     {-inf, 0}}; // 与最大值颜色不同的 次大值
        for (int i = s; i <= s + k; i++) {
            pii v = {f[i - 1][i - s], C[i - 1]};
            if (v > mx[0])
                swap(v, mx[0]);
            if (mx[0].second == mx[1].second || (v > mx[1] and v.second != mx[0].second))
                mx[1] = v;
            f[i][i - s] = mx[mx[0].second == C[i]].first + V[i];
        }
    }
    cout << max(-1ll, f[n - 1][k]) << "\n";
    return 0;
}

标签:AtCoder,const,Beginner,int,vi,cin,long,345,using
From: https://www.cnblogs.com/PHarr/p/18083869

相关文章

  • [ABC345F] Many Lamps 题解
    题意:给定一个\(n\)个点\(m\)条边的无向图,每个点的初始颜色为\(0\)。一次操作是将一条边的两个端点的颜色翻转。求是否能通过若干次操作使得最终有\(k\)个颜色为\(1\)的点。首先考虑什么情况下无解。会发现每一次操作,颜色为\(1\)的点的数量变化一定是\([0,+2,-2]\)......
  • AtCoder Beginner Contest 345 A-F 题解
    A-LeftrightarrowQuestion给你一个由<、=和>组成的字符串\(S\)。请判断\(S\)是否是双向箭头字符串。字符串\(S\)是双向箭头字符串,当且仅当存在一个正整数\(k\),使得\(S\)是一个<、\(k\)个=和一个>的连接,且顺序如此,长度为\((k+2)\)。Solution按照题意......
  • Atcoder ARC165D Xor Sum 5
    考虑到这个最终的答案是\(\oplus\),所以只需要考虑每种排列出现的次数的奇偶,如果为奇再计算贡献即可。考虑什么情况下出现次数为奇。令每个数出现的个数为\(c_{1\simn}\),方案数即为\(\dbinom{k}{c_1,c_2,\cdots,c_n}=\prod_{i=1}^n\dbinom{k-\sum\limits_{j=1}^{......
  • abc345e 做题小计
    F比E简单,套路题。考场不会E。自闭。Luogu链接题意已经讲得很清楚了。在题解中,认为\(m\)等价于原题的\(k\)。思考第一步看题应该会想到贪心。先去掉重复,然后会剩下一些相邻互不相同的,然后从小到大排序删除即可。没错,考场上就是这样想的,直接吃了依托大的罚时这样......
  • ABC 345 F - Many Lamps
    ABC345F-ManyLamps解题思路:每次选取一条边,要么亮两个,要么灭两个,要么一灭一暗。亮的个数的奇偶性不变,所以不可能亮奇数个。考虑每个连通块。如果是偶数个一定能全亮,奇数个则最少一个不亮。对于两暗的,需要时通过操作点亮是一定的。考虑一明一暗时是加入边的操作意味什么:......
  • Monoxer Programming Contest 2024(AtCoder Beginner Contest 345)
    MonoxerProgrammingContest2024(AtCoderBeginnerContest345)\(A\)Leftrightarrow\(100pts\)按照题意模拟即可。点击查看代码intmain(){strings;inta=0,b=0,c=0,i;cin>>s;for(i=0;i<s.size();i++){a+=(s[i]=='<&#......
  • AT_abc345_c [ABC345C] One Time Swap 题解
    题目传送门解法对于\(S_{i}\),设\(num_{S_{i}}\)表示\(S_{i+1\simn}\)中\(S_{i}\)出现的次数,则\(S_{i}\)对答案产生的贡献为\(n-i-num_{S_{i}}\)。注意原串在存在两个相同的元素的时候,也要统计在内。代码#include<bits/stdc++.h>usingnamespacestd;#definell......
  • AtCoder-abc345_f题解
    题意简述给定一个无向图。你要在其中选出一些边,使得选出的边所构成的图中,度数为奇数的点有\(K\)个。如果可以,输出选了哪些边,否则输出-1。思路首先在选一条边时,边两端点度数的奇偶性一定都会改变,即要么都变为奇数,要么两个点的奇偶性交换过来,要么都变为偶数。这三种情况时满足......
  • ABC345 A ~ D
    ABC345题外话:巨难。A翻译现在给你一个字符串,定义一个合法的箭头由一个<,\(k\)个=,一个>组成的长度为\(k+2\)的字符串。问字符串\(s\)是否是一个合法的箭头。思路赛时因为翻译问题,吃了\(1\)发罚时。只需要判断\(s_1\)是否为<,\(s_2\sims_{n-1}\)是否为=,\(s_......
  • AT_abc345_d 题解
    是个逆天搜索。最开始:爆搜,启动!然后TLE到飞起。赛后:我【数据删除】这么简单的吗?!dfs每个位置,试着把没放过的块放到以这个位置为左上角的区域里面。好了没了,就是这么简单!对了记得这个块可以旋转!#include<stdio.h>#include<bits/stdc++.h>#defineN1000010#defineMOD9......