首页 > 其他分享 >Educational Codeforces Round 47 (Rated for Div

Educational Codeforces Round 47 (Rated for Div

时间:2024-12-18 19:22:13浏览次数:4  
标签:Educational Rated int 47 pos long solve ans define

Educational Codeforces Round 47 (Rated for Div. 2)

A. Game Shopping

​ 暴力模拟即可

#include <bits/stdc++.h>

using namespace std;
#define int long long
#define inf INT32_MAX
#define PII pair<int,int>
#define endl '\n'

inline void solve() {
    int n, m;
    cin >> n >> m;
    vector<int> arr(n + 1);
    for (int i = 1; i <= n; i++)cin >> arr[i];
    queue<int> q;
    for (int i = 1; i <= m; i++) {
        int x;
        cin >> x;
        q.push(x);
    }
    int ans = 0;
    for (int i = 1; i <= n; i++) {
        if (q.empty())break;
        if (arr[i] <= q.front()) {
            ans++;
            q.pop();
        }
    }
    cout << ans << endl;
}

signed main() {
#ifdef ONLINE_JUDGE
#else
    freopen("test.in", "r", stdin);
    freopen("test.out", "w", stdout);
#endif
    ios::sync_with_stdio(0);
    cout.tie(0);
    cin.tie(0);
    int t = 1;
//    cin >> t;
    while (t--)
        solve();
    return 0;
}

B. Minimum Ternary String

​ 观察题目可以发现每次移动可以看作只有1在左右移动,0与2不能交换位置,所以最总答案是把所有1聚在一块原本0和2的位置不发生改变,于是问题变为把1插在哪里使得字符串字典序最小,显然插在第一个不是0的位置前即可

#include <bits/stdc++.h>

using namespace std;
#define int long long
#define inf INT32_MAX
#define PII pair<int,int>
#define endl '\n'

inline void solve() {
    string s;
    cin >> s;

    string ans;

    int cnt = 0;
    for (auto c: s) {
        if (c == '1') ++cnt;
        else ans += c;
    }

    int n = ans.size();
    int pos = -1;
    while (pos + 1 < n && ans[pos + 1] == '0') ++pos;
    ans.insert(pos + 1, string(cnt, '1'));

    cout << ans << endl;
}

signed main() {
#ifdef ONLINE_JUDGE
#else
    freopen("test.in", "r", stdin);
    freopen("test.out", "w", stdout);
#endif
    ios::sync_with_stdio(0);
    cout.tie(0);
    cin.tie(0);
    int t = 1;
//    cin >> t;
    while (t--)
        solve();
    return 0;
}

C. Annoying Present

​ 由于每一个位置都会加上\(x_i\)所以x与选择的位置没有关系,那么来讨论选择位置与\(d_i\)的关系。稍微计算一下可也得到

​ · 如果\(d_i\le0\)在数组的中点位置可以确保总和最大

​ · 如果\(d_i>0\)那么在数组的左右端点处可以确保总和最大

​ 由此可以得到结果

#include <bits/stdc++.h>

using namespace std;
#define int long long
#define inf INT32_MAX
#define PII pair<int,int>
#define endl '\n'

inline void solve() {
    int n, q;
    cin >> n >> q;
    int sum = 0;
    while (q--) {
        int x, d;
        cin >> x >> d;
        sum += x * n;
        if (d < 0) {
            int cnt = (n - 1) / 2;
            sum += (cnt * d + d) * cnt + (n % 2 == 0) * (cnt * d + d);
        } else {
            int cnt = n - 1;
            sum += (d + cnt * d) * cnt / 2;
        }
    }
    double ans = 1.0 * sum / n;
    cout << fixed << setprecision(12) << ans << endl;
}


signed main() {
#ifdef ONLINE_JUDGE
#else
    freopen("test.in", "r", stdin);
    freopen("test.out", "w", stdout);
#endif
    ios::sync_with_stdio(0);
    cout.tie(0);
    cin.tie(0);
    int t = 1;
//    cin >> t;
    while (t--)
        solve();
    return 0;
}

D. Relatively Prime Graph

​ 首先观察数据发现\(n,m\leq10^5\)由于边的上限是\(10^5\)那么简单打表一下可以发现当\(n=600时\),可以连的边就已经大于\(10^5\)了,而暴力枚举只需要\(n^2\)的复杂度那么,如果对于所有数直接暴力枚举即可

​ 需要特判,如果边小于点的个数减一即\(m<n-1\)那么无法构造出一个n点m边的图输出\(Impossible\)

#include <bits/stdc++.h>

using namespace std;
#define int long long
#define inf INT32_MAX
#define PII pair<int,int>
#define endl '\n'

inline void solve() {
    int n, m;
    cin >> n >> m;
    vector<PII > ans;
    if (m < n - 1) {
        puts("Impossible");
        return;
    }
    for (int i = 1; i <= n; i++) {
        for (int j = i + 1; j <= n; j++) {
            if (__gcd(i, j) == 1)
                ans.push_back(make_pair(i, j));
            if (ans.size() == m)break;
        }
        if (ans.size() == m)break;
    }
    if (ans.size() == m) {
        cout << "Possible\n";
        for (auto [x, y]: ans)cout << x << ' ' << y << endl;
    } else cout << "Impossible\n";
}


signed main() {
#ifdef ONLINE_JUDGE
#else
    freopen("test.in", "r", stdin);
    freopen("test.out", "w", stdout);
#endif
    ios::sync_with_stdio(0);
    cout.tie(0);
    cin.tie(0);
    int t = 1;
//    cin >> t;
    while (t--)
        solve();
    return 0;
}

E. Intercity Travelling

​ 题目中实际上每次是从1号点开始移动

​ 乘以\(2^{n-1}\)相当于把原本计算的期望的分母消了,所以计算所有可能得难度和即可

​ 设\(pos\)假设在\(pos\)点位置产生了\(a_i\)的难度贡献,那么说明在\((pos-i,pos)\)这个区间内不存在休息点而其余位置不管有没有休息点都可以那么对于每一个满足条件的\(pos,pos\in[i,n]\)都会产生\(a_i\)的难度贡献,注意

​ ·当\(i = pos\)的时候区间左端点被固定,产生的贡献为\(a_i\cdot 2^{n-i}\)

​ ·当\(i\neq pos\)的时候区间左右都没有被固定,但是需要排除\(i=pos\)的情况,所以产生的贡献就是\(a_i\cdot (n - i)\cdot 2^{n-i-1}\)

​ 综上答案通式为\(ans=\sum_{i=1}^n(2^{n-i}+(n-i)\cdot2^{n-i-1})\cdot a_i\)

#include <bits/stdc++.h>

using namespace std;
#define int long long
#define inf INT32_MAX
#define PII pair<int,int>
#define endl '\n'
const int mod = 998244353;

inline void solve() {
    int n;
    cin >> n;
    int ans = 0;
    vector<int> num(n + 1);
    num.front() = 1;
    for (int i = 1; i <= n; i++)num[i] = (num[i - 1] * 2) % mod;
    for (int i = 1; i <= n; i++) {
        int x;
        cin >> x;
        ans = (ans + (num[n - i] + (n - i) * num[n - i - 1]) % mod * x % mod) % mod;
    }
    cout << ans << endl;
}


signed main() {
#ifdef ONLINE_JUDGE
#else
    freopen("test.in", "r", stdin);
    freopen("test.out", "w", stdout);
#endif
    ios::sync_with_stdio(0);
    cout.tie(0);
    cin.tie(0);
    int t = 1;
//    cin >> t;
    while (t--)
        solve();
    return 0;
}

F. Dominant Indices

​ 题目大意为:给定一棵以1为根节点的有n个节点的树,设\(f(x,i)为x子树中到x距离为i的节点数\),对于每个点求一个最小的\(k,使得f(x,k)最大。(1\leq n\leq 10^6)\)

​ 暴力思想:用\(f[x][i]\)表示在x子树内与x距离为i的节点数,暴力枚举\(\sum_{y\in son[x]}f[y][i-1]\)是\(n^2\)的复杂度会\(TLE\)

​ 用长链剖分进行优化

​ 1.先搜索重儿子,搜完一条链上的重儿子,回溯时,先让父节点继承重儿子答案,

​ 2.再搜索轻儿子,回溯时,暴力合并轻儿子上的信息,然后更新答案

​ 如果\(f数组\)开成\(N^2\)空间会炸掉。可以巧妙的通过指针给每个节点动态分配内存才来解决这个问题

#include <bits/stdc++.h>

using namespace std;
#define int long long
#define inf INT32_MAX
#define PII pair<int,int>
#define endl '\n'
const int mod = 998244353;
const int N = 1e6 + 7;
vector<int> e[N];
int son[N], len[N];
int buf[N], *f[N], *p = buf, ans[N];
//buf相当于f数组的第二维
//*f则是f数组的第一维
//f[i][j]第一维表示节点信息,第二维表示距离
void dfs(int x, int fa) {
    for (int y: e[x]) {
        if (y == fa)continue;
        dfs(y, x);
        if (len[son[x]] < len[y])son[x] = y;//dfs跑长儿子
    }
    len[x] = len[son[x]] + 1;
}

void dp(int x, int fa) {
    f[x][0] = 1;//到本身距离为0的点是本身
    if (son[x]) {//优先跑长链,后续答案向长链上合并
        f[son[x]] = f[x] + 1;//共享内存,拷贝数组
        dp(son[x], x);
        ans[x] = ans[son[x]] + 1;//继承长儿子节点答案
    }
    for (int y: e[x]) {
        if (y == fa || y == son[x])continue;
        f[y] = p,p += len[y];//给y开头的链申请空间
        dp(y, x);
        for (int j = 1; j <= len[y]; j++) {
            f[x][j] += f[y][j - 1];//累加所有子节点状态
            if (f[x][j] > f[x][ans[x]] || (f[x][j] == f[x][ans[x]] && j < ans[x]))//第一种为节点数更多,第二种则为k值更小
                ans[x] = j;
        }
    }
    if (f[x][ans[x]] == 1)ans[x] = 0;//唯一节点为本身
}

inline void solve() {
    int n;
    cin >> n;
    for (int i = 1; i < n; i++) {
        int x, y;
        cin >> x >> y;
        e[x].push_back(y);
        e[y].push_back(x);
    }
    dfs(1, 0);
    f[1] = p,p += len[1];//为根节点申请空间
    dp(1, 0);
    for (int i = 1; i <= n; i++)cout << ans[i] << "\n";
}


signed main() {
#ifdef ONLINE_JUDGE
#else
    freopen("test.in", "r", stdin);
    freopen("test.out", "w", stdout);
#endif
    ios::sync_with_stdio(0);
    cout.tie(0);
    cin.tie(0);
    int t = 1;
//    cin >> t;
    while (t--)
        solve();
    return 0;
}

如有不懂请看董晓老师的b站视频讲解 D34【模板】长链剖分 CF1009F Dominant Indices

标签:Educational,Rated,int,47,pos,long,solve,ans,define
From: https://www.cnblogs.com/pei-solution/p/18615718

相关文章

  • 【MATLAB源码-第247期】基于matlab的秃鹰搜索优化算法(BES)无人机三维路径规划,输出做
    操作环境:MATLAB2022a1、算法描述秃鹰搜索优化算法(BaldEagleSearch,BES)是一种新颖的群体智能优化算法,受自然界中秃鹰猎食行为的启发而设计。与其他群体智能算法类似,BES试图通过模拟自然界的某些行为来解决复杂的优化问题。该算法的核心思想是通过模拟秃鹰在猎食过程中的......
  • LeetCode题练习与总结:供暖器--475
    一、题目描述冬季已经来临。 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖。在加热器的加热半径范围内的每个房屋都可以获得供暖。现在,给出位于一条水平线上的房屋 houses 和供暖器 heaters 的位置,请你找出并返回可以覆盖所有房屋的最小加热半径。注意:所......
  • LeetCode题练习与总结:一和零--474
    一、题目描述给你一个二进制字符串数组 strs 和两个整数 m 和 n 。请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1 。如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。示例1:输入:strs=["10","0001",......
  • 第47节 ArkTS 创建自定义组件
    在ArkTS中创建自定义组件是一个相对简单但功能强大的过程。以下是如何在ArkTS中创建和使用自定义组件的详细步骤:一、定义自定义组件1.使用@Component注解:为了注册一个组件,使其能够在其他文件中被引用,你需要使用@Component注解。例如:@ComponentstructMyComp......
  • SSM高校社团学生会管理系统--47676(免费领源码)可做计算机毕业设计JAVA、PHP、爬虫、APP
    摘  要本论文基于SSM框架,设计和实现了一个高校社团学生会管理系统。该系统旨在提供一个全面、高效、智能的高校社团学生会管理平台,以便管理者可以迅速且便捷地进行各项管理工作,并及时向社团成员提供准确的社团信息。  该系统通过角色划分为社团成员、社团社长和管理员......
  • 1847. 最近的房间
      一个酒店里有 n 个房间,这些房间用二维整数数组 rooms 表示,其中 rooms[i]=[roomIdi,sizei] 表示有一个房间号为 roomIdi 的房间且它的面积为 sizei 。每一个房间号 roomIdi 保证是 独一无二 的。同时给你 k 个查询,用二维数组 queries 表示,其中......
  • LeetCode题练习与总结:连接词--472
    一、题目描述给你一个 不含重复 单词的字符串数组 words ,请你找出并返回 words 中的所有 连接词 。连接词 定义为:一个完全由给定数组中的至少两个较短单词(不一定是不同的两个单词)组成的字符串。示例1:输入:words=["cat","cats","catsdogcats","dog","dogcatsdog......
  • LeetCode题练习与总结:火柴拼正方形--473
    一、题目描述你将得到一个整数数组 matchsticks ,其中 matchsticks[i] 是第 i 个火柴棒的长度。你要用 所有的火柴棍 拼成一个正方形。你 不能折断 任何一根火柴棒,但你可以把它们连在一起,而且每根火柴棒必须 使用一次 。如果你能使这个正方形,则返回 true ,否则返......
  • 代码随想录算法训练营第四十六天|leetcode647. 回文子串、leetcode516.最长回文子序列
    1leetcode647.回文子串题目链接:647.回文子串-力扣(LeetCode)文章链接:代码随想录视频链接:动态规划,字符串性质决定了DP数组的定义|LeetCode:647.回文子串哔哩哔哩bilibili思路:嘿,看不懂有一点,看解析吧1.1视频后的方法其实看完视频以后,感觉这个题目真的不难,我想到了二维......
  • springboot在线医疗平台小程序-计算机毕业设计源码24757
    摘 要本文介绍了一个基于SpringBoot的在线医疗平台的设计与实现。该平台旨在为用户提供便捷、高效的在线医疗服务,包括在线咨询、挂号预约、药品信息管理班等功能。在线医疗平台具有以下主要功能:用户登录与注册、医生和患者管理、在线咨询和预约、药品信息管理等。通过该......