CodeCraft-21 and Codeforces Round 711 (Div. 2)A-F

news2025/1/10 23:40:32

1.Problem - A - Codeforces

        (1)题意 

                求一个大于等于n的整数x,满足gcd(x,sum(dig(x)) > 1,dig表示x的各个数位。

        (2)思路

                考虑最差是满足gcd(x,sum(dig(x)) = 2,因此不会枚举很多,直接暴力枚举即可。

        (3)代码

#include <bits/stdc++.h>
#define rep(i,z,n) for(int i = z;i <= n; i++)
#define per(i,n,z) for(int i = n;i >= z; i--)
#define PII pair<int,int>
#define fi first
#define se second
#define vi vector<int>
#define vl vector<ll>
#define pb push_back
#define sz(x) (int)x.size()
#define all(x) (x).begin(),(x).end()
using namespace std;
using ll = long long;
const int N = 2e5 + 10;
bool check(ll x)
{
    ll s = 0,rx = x;
    while(rx) {
        s += rx % 10;
        rx /= 10;
    }
    return __gcd(x,s) >= 2;
}
void solve()
{
    ll n;
    cin >> n;
    while(n) {
        if(check(n)) break;
        n ++;
    }
    cout << n << '\n';
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int T = 1;
    cin >> T;
    while(T --) solve();
    return 0;
}

2.Problem - B - Codeforces

        (1)题意

                给你n个高为1,宽为w[i]的矩形,你有一个大矩型已经确定了宽为W,你需要确定最小的h满足能放入所有的高为1的矩形。

        (2)思路

                考虑h一定满足单调性,所以直接二分h的值即可。

        (3)代码

#include <bits/stdc++.h>
#define rep(i,z,n) for(int i = z;i <= n; i++)
#define per(i,n,z) for(int i = n;i >= z; i--)
#define PII pair<int,int>
#define fi first
#define se second
#define vi vector<int>
#define vl vector<ll>
#define pb push_back
#define sz(x) (int)x.size()
#define all(x) (x).begin(),(x).end()
using namespace std;
using ll = long long;
const int N = 2e5 + 10;
int a[N],n,w;
bool check(int x)
{
    multiset<int> st;
    rep(i,1,x) st.insert(w);
    per(i,n,1) {
        auto it = st.lower_bound(a[i]);
        if(it == st.end()) return false;
        int res = *it - a[i];
        st.erase(it);
        st.insert(res);
    }
    return true;
}
void solve()
{
    cin >> n >> w;
    rep(i,1,n) cin >> a[i];
    sort(a + 1,a + 1 + n);
    int l = 1,r = n;
    while(l <= r) {
        int m = (l + r) >> 1;
        if(check(m)) r = m - 1;
        else l = m + 1;
    }
    cout << l << '\n';
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int T = 1;
    cin >> T;
    while(T --) solve();
    return 0;
}

3.Problem - C - Codeforces

        (1)题意

                给你一条长为k的射线,有n面镜子,每次你穿过一面镜子有两种选择,一种是降低你目前的等级,然后新生成一条反方向为目前等级-1的射线,一种是直接穿过镜子,问最多会有多少条射线。

        (2)思路

                发现这是个计数题,因此直接考虑dp,dp[i][j]表示当前射线为i有j面镜子的方案数是多少。

                转移方程:

                        1.若前一条是通过降级来的,则应该是dp[i - 1][n - j]这个位置来的。

                        2.若前一条是通过直接穿的,则应该是dp[i][j - 1]这个位置来的。

        (3)代码

#include <bits/stdc++.h>
#define rep(i,z,n) for(int i = z;i <= n; i++)
#define per(i,n,z) for(int i = n;i >= z; i--)
#define PII pair<int,int>
#define fi first
#define se second
#define vi vector<int>
#define vl vector<ll>
#define pb push_back
#define sz(x) (int)x.size()
#define all(x) (x).begin(),(x).end()
using namespace std;
using ll = long long;
const int N = 2e5 + 10;
using i64 = long long;

constexpr int P = 1e9 + 7;
// assume -P <= x < 2P
int Vnorm(int x) {
    if (x < 0) {
        x += P;
    }
    if (x >= P) {
        x -= P;
    }
    return x;
}
template<class T>
T power(T a, i64 b) {
    T res = 1;
    for (; b; b /= 2, a *= a) {
        if (b % 2) {
            res *= a;
        }
    }
    return res;
}
struct Mint {
    int x;
    Mint(int x = 0) : x(Vnorm(x)) {}
    Mint(i64 x) : x(Vnorm(x % P)) {}
    int val() const {
        return x;
    }
    Mint operator-() const {
        return Mint(Vnorm(P - x));
    }
    Mint inv() const {
        assert(x != 0);
        return power(*this, P - 2);
    }
    Mint &operator*=(const Mint &rhs) {
        x = i64(x) * rhs.x % P;
        return *this;
    }
    Mint &operator+=(const Mint &rhs) {
        x = Vnorm(x + rhs.x);
        return *this;
    }
    Mint &operator-=(const Mint &rhs) {
        x = Vnorm(x - rhs.x);
        return *this;
    }
    Mint &operator/=(const Mint &rhs) {
        return *this *= rhs.inv();
    }
    friend Mint operator*(const Mint &lhs, const Mint &rhs) {
        Mint res = lhs;
        res *= rhs;
        return res;
    }
    friend Mint operator+(const Mint &lhs, const Mint &rhs) {
        Mint res = lhs;
        res += rhs;
        return res;
    }
    friend Mint operator-(const Mint &lhs, const Mint &rhs) {
        Mint res = lhs;
        res -= rhs;
        return res;
    }
    friend Mint operator/(const Mint &lhs, const Mint &rhs) {
        Mint res = lhs;
        res /= rhs;
        return res;
    }
    friend std::istream &operator>>(std::istream &is, Mint &a) {
        i64 v;
        is >> v;
        a = Mint(v);
        return is;
    }
    friend std::ostream &operator<<(std::ostream &os, const Mint &a) {
        return os << a.val();
    }
};

void solve()
{
    int n,k;
    cin >> n >> k;
    vector<vector<Mint>> dp(k + 1,vector<Mint>(n + 1));
    rep(i,1,k) dp[i][0] = 1;
    rep(i,1,k) {
        rep(j,1,n) {
            dp[i][j] += dp[i - 1][n - j] + dp[i][j - 1];
        }
    }
    cout << dp[k][n] << '\n';
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int T = 1;
    cin >> T;
    while(T --) solve();
    return 0;
}

4.Problem - D - Codeforces

        (1)题意

                你有n个活动事件,m个位置,初始在0这个位置,每一次活动给出Ti,Xi,Yi表示这个活动的类型是Ti,每一次步长为Xi'(Xi = Xi'/100000),可以执行[0,Yi]次这个步长,若Ti为1或2,若Ti为1,则表示这一次会变成pos = (pos + Xi),若Ti为2,则表示这一次会变成pos = (pos * Xi), 问你最早到达[1,m]每一个位置是第几个活动事件。

        (2)思路

                直接暴力即可,记Ans[i]表示到第i个位置的最早时间,若这个位置被走过了则时间可以不执行了,若当前位置已经跳出m了,则也不执行了。

        (3)代码

#include <bits/stdc++.h>
#define rep(i,z,n) for(int i = z;i <= n; i++)
#define per(i,n,z) for(int i = n;i >= z; i--)
#define PII pair<int,int>
#define fi first
#define se second
#define vi vector<int>
#define vl vector<ll>
#define pb push_back
#define sz(x) (int)x.size()
#define all(x) (x).begin(),(x).end()
using namespace std;
using ll = long long;
const int N = 2e5 + 10;
int Ans[N];
const int inf = 0x3f3f3f3f;
void solve()
{
    int n,m;
    cin >> n >> m;
    rep(i,1,m) Ans[i] = inf;
    rep(i,1,n) {
        ll t,x,y;
        cin >> t >> x >> y;
        per(j,m,0) {
            if(Ans[j] == inf) continue;
            ll p = j;
            rep(k,1,y) {
                if(t == 1) p = p + (99999 + x) / 100000;
                else p = (p * x + 99999) / 100000;
                if(p > m) break;
                if(Ans[p] < inf) break;
                Ans[p] = i;
            }
        }
    }
    rep(i,1,m) {
        if(Ans[i] == inf) cout << -1 << ' ';
        else cout << Ans[i] << ' ';
    }
}   
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int T = 1;
    // cin >> T;
    while(T --) solve();
    return 0;
}

5.Problem - E - Codeforces

        (1)题意        (2)思路

                考虑这个图是一个竞赛图,我们可以直接用竞赛图解,对于一个竞赛图若按照点的出度进行排序,缩点后前面的点必定向后面所有点右边,若某一个位置前面的点的出度和为i * (i - 1) / 2,说明前面必定出现了SCC,如果前面j个点也出现了这个情况,说明要么前i个点存在两个SCC,要么后面这个不存在SCC,证明可得后面这个也一定是SCC。那么我们只需要挑一个最大的SCC的|Ka-Kb|即可。

        (3)代码

#include <bits/stdc++.h>
#define rep(i,z,n) for(int i = z;i <= n; i++)
#define per(i,n,z) for(int i = n;i >= z; i--)
#define PII pair<int,int>
#define fi first
#define se second
#define vi vector<int>
#define vl vector<ll>
#define pb push_back
#define sz(x) (int)x.size()
#define all(x) (x).begin(),(x).end()
using namespace std;
using ll = long long;
const int N = 2e5 + 10;
PII e[N];
void solve()
{
    int n;
    cin >> n;
    rep(i,1,n) {
        cin >> e[i].fi;
        e[i].se = i;
    }
    stable_sort(e + 1,e + 1 + n);
    int v = 0,mx = -1,lst = 0;
    PII Ans = {0,0};
    rep(i,1,n) {
        v += e[i].fi;
        if(v == i * (i - 1) / 2) {
            if(lst != i - 1) {
                int rs = e[i].fi - e[lst + 1].fi;
                if(rs > mx) {
                    Ans = {e[lst + 1].se,e[i].se};
                    mx = rs;
                }
            }
            lst = i;
        }
    }
    cout << "! " << Ans.fi << ' ' << Ans.se << endl;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int T = 1;
    // cin >> T;
    while(T --) solve();
    return 0;
}

6.Problem - F - Codeforces

        (1)题意

                Alice和Bob在一颗树上玩游戏,第i个节点有a[i]个石头,每轮可以选择一个距离根深度至少为k的点往上移动任意石头,问对每个节点作为根最后谁会赢。

        (2)思路

                对于k为1,无非就是一个树上阶梯尼姆博弈

                对于k为d,我们猜测会是一个dep/d的树上阶梯尼姆博弈

                因此我们考虑dp[i][j][k]表示在第i个点,距离i为j的,奇偶性为k的贡献是多少。

                1.对于j < k的奇偶性不会发生变化

                        dp[x][i][j] ^= dp[y][i - 1][j]

                2.对于j == k的会发生变化因此特殊转移就行。

                        dp[x][0][j] ^= dp[y][k - 1][j ^ 1]

                剩下的其他根换根dp一下就可以

       (3)代码

#include <bits/stdc++.h>
#define rep(i,z,n) for(int i = z;i <= n; i++)
#define per(i,n,z) for(int i = n;i >= z; i--)
#define PII pair<int,int>
#define fi first
#define se second
#define vi vector<int>
#define vl vector<ll>
#define pb push_back
#define sz(x) (int)x.size()
#define all(x) (x).begin(),(x).end()
using namespace std;
using ll = long long;
const int N = 1e5 + 10;
vector<int> e[N];
int dp[N][21][2],Ans[N],a[N];
int n,k;
inline void do_dp(int x,int y)
{
    rep(i,1,k - 1) {
        rep(j,0,1) {
            dp[x][i][j] ^= dp[y][i - 1][j];
        }
    }
    dp[x][0][0] ^= dp[y][k - 1][1];
    dp[x][0][1] ^= dp[y][k - 1][0];
}
inline void dfs(int u,int f)
{
    dp[u][0][0] = a[u];
    for(auto v : e[u]) {
        if(v == f) continue;
        dfs(v,u);
        do_dp(u,v);
    }
}
inline void dfs2(int u,int f)
{
    if(f) {
        do_dp(f,u);
        do_dp(u,f);
    }
    rep(i,0,k - 1) Ans[u] ^= dp[u][i][1];
    for(auto v : e[u]) {
        if(v == f) continue;
        dfs2(v,u);
    }
    if(f) {
        do_dp(u,f);
        do_dp(f,u);
    }
}
void solve()
{
    cin >> n >> k;
    rep(i,2,n) {
        int u,v;
        cin >> u >> v;
        e[u].pb(v),e[v].pb(u);
    }
    rep(i,1,n) cin >> a[i];
    dfs(1,0);
    dfs2(1,0);
    rep(i,1,n) {
        if(Ans[i]) cout << 1 << ' ';
        else cout << 0 << ' ';
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int T = 1;
    // cin >> T;
    while(T --) solve();
    return 0;
}

                

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1058908.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Diffusion】DDPM - (2)公式推导 之 前向扩散

1、加噪过程 1、将 图像 x 0 x_0 x0​ 像素值映射到 [-1, 1] 之间 x 255 2 − 1 , w h e r e    x 为图像中的像素值 \quad \frac{x}{255} \times 2-1, \quad where \; x 为图像中的像素值 255x​2−1,wherex为图像中的像素值 \quad 2、生成一张尺寸相同的噪声图片,像…

【Kafka专题】Kafka收发消息核心参数详解

目录 前置知识课程内容一、从基础的客户端说起&#xff08;Java代码集成使用&#xff09;1.1 消息发送者源码示例1.2 消息消费者源码示例1.3 客户端使用小总结 *二、从客户端属性来梳理客户端工作机制*2.1 消费者分组消费机制2.2 生产者拦截器机制2.3 消息序列化机制2.4 消息分…

二叉搜索树 , Set 和 Map (JAVA)

二叉搜索树 二叉搜索树又称二叉排序树&#xff0c;它具有以下性质的二叉树或空树: 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根节点的值它的每颗子树也分别为二叉搜索树 二叉搜索树的…

北京开发APP需要多少钱

北京开发一个移动应用&#xff08;APP&#xff09;的费用因多种因素而异&#xff0c;包括项目的规模、复杂性、所需功能、设计要求、技术选择、开发团队的经验和地理位置等。一般来说&#xff0c;北京的APP开发费用通常较高&#xff0c;因为这是中国的主要技术和创新中心之一&a…

【云备份项目】:环境搭建(g++、json库、bundle库、httplib库)

文章目录 1. g 升级到 7.3 版本2. 安装 jsoncpp 库3. 下载 bundle 数据压缩库4. 下载 httplib 库从 Win 传输文件到 Linux解压缩 1. g 升级到 7.3 版本 &#x1f517;链接跳转 2. 安装 jsoncpp 库 &#x1f517;链接跳转 3. 下载 bundle 数据压缩库 安装 git 工具 sudo yum…

嵌入式Linux应用开发-驱动大全-第一章同步与互斥①

嵌入式Linux应用开发-驱动大全-第一章同步与互斥① 第一章 同步与互斥①1.1 内联汇编1.1.1 C语言实现加法1.1.2 使用汇编函数实现加法1.1.3 内联汇编语法1.1.4 编写内联汇编实现加法1.1.5 earlyclobber的例子 1.2 同步与互斥的失败例子1.2.1 失败例子11.2.2 失败例子21.2.3 失败…

IDEA中的神仙插件——Smart Input (自动切换输入法)

推荐专栏&#xff1a;开发环境配置攻略 致力于记录学习过程中各种软件的安装及环境配置操作&#xff0c;并提供详细的步骤说明和丰富的配图。涵盖了 Java、Python、IntelliJ IDEA、Tomcat、MySQL 等常见开发工具和服务器组件的配置&#xff0c;为初学者提供一个实用、全面的配置…

Sentinel-2波段合成

Sentinel-2波段合成 在上一篇博客中下载了Sentinel-2数据&#xff0c;他有13个波段的.jp2文件&#xff0c;下面选取需要使用的波段进行合成。 导入了B2&#xff08;蓝色&#xff09;、B3&#xff08;绿色&#xff09;、B4&#xff08;红色&#xff09;、B8&#xff08;近红外&…

第一章 概论

第一章 概论 引言基本概念和术语数据、数据元素和数据项数据的逻辑结构数据的存储结构&#xff08;物理结构&#xff09;运算 算法及描述算法分析时间复杂度空间复杂度 牛刀小试 引言 数据结构是指一组相互之间存在一种或多种特定关系的数据的组织方式和它们在计算机内的存储方…

【Java 进阶篇】JDBC PreparedStatement 详解

在Java中&#xff0c;与关系型数据库进行交互是非常常见的任务之一。JDBC&#xff08;Java Database Connectivity&#xff09;是Java平台的一个标准API&#xff0c;用于连接和操作各种关系型数据库。其中&#xff0c;PreparedStatement 是 JDBC 中一个重要的接口&#xff0c;用…

ARM---实现1-100求和任务

.text .globl _start_start:mov r0, #0x1mov r1, #0x1 给r1加一固定1不变mov r2, #0x64 100判断bl sumcmp r1, r2 sum:addcc r1, r1,#0x1 r1自增addcc r0, r0, r1 r0求和movcc pc,lrstop:b stop.end

Linux shell编程学习笔记6:查看和设置变量的常用命令

上节我们介绍了变量的变量命名规则、变量类型、使用变量时要注意的事项&#xff0c;今天我们学习一下查看和设置变量的一些常用命令&#xff0c;包括变量的提升&#xff0c;有些命令在之前的实例中已经使用过了。 一、 echo &#xff1a;查看变量的值 语法格式&#xff1a;ech…

金融机构操作风险与内控合规的介绍

目录 一.前言 术语 二.功能设计 三.部分功能简介 流程管理 流程清单 流程详情 流程重检 流程重检反馈 风险与控制自我评估&#xff08;RCSA&#xff09; 评估计划管理 评估结果管理 关键风险指标&#xff08;KRI&#xff09; 指标库管理 基础数据项录入 指标监测…

电阻的基础与应用

文章目录 电阻的基础与应用电阻的介绍与分类电阻介绍电阻的分类碳膜/金属膜电阻厚膜/薄膜电阻功能性电阻&#xff08;光敏/热敏/压敏&#xff09;特殊电阻&#xff08;绕线电阻/水泥电阻/铝壳电阻&#xff09; 电阻的主要厂家与介绍国外厂家VISHAY(威世)KOA(兴亚)Kyocera(京瓷)…

电脑右键新建记事本不见了--设置恢复篇(无需操作注册表)

电脑右键新建记事本不见了–设置恢复篇&#xff08;无需修改注册表&#xff09; 电脑不知怎么想右键新建记事本结果竟然不见了&#xff0c;搜寻网上的都是什么修改注册表&#xff0c;粘贴代码修复&#xff08;感觉太复杂了&#xff09;&#xff0c;这里介绍通过设置内重新对记…

❋JQuery的快速入门 1 了解jq

目录 选定元素 1. jquery基本选择器 2. 层级选择器 3. 元素精确定位 4. 内容选择器 5. 属性选择器及其他 元素解析 操作元素内容与样式 操作文档的文本结构 jq事件 jq动画 JQuery 是一个“写的更少&#xff0c;但做的更多”的轻量级 JavaScript 库。 使用前要先导入…

自定义实现hashmap-python

前文 ​ 今天这篇文章给大家讲讲hashmap&#xff0c;这个号称是所有前后端工程师都会的数据结构。 hashmap基本结构 ​ hashmap这个数据结构其实并不难&#xff0c;它的结构非常清楚&#xff0c;说白了就是一个定长的链表&#xff0c;这个数组的每一个元素都是一个链表。我们…

AutoForm R11安装说明视频教程

AutoForm R11安装说明视频教程 安装AutoForm.Forming.R11.Win64_01在安装过程中选择安装许可证服务器并输入许可证服务器2375localhost和完成 安装 -继续解文件夹复制2个文件并在C:\Program files\RLM_v14.1BL3上替换它们作为管理员运行RLM.exe 确保您的系统环境如下所示&a…

(unordered)map和set封装(底层红黑树)

map和set封装 文章目录 map和set封装设计问题&#xff08;知其所以然&#xff09;为什么要对iterator进行封装&#xff1f;为什么要引入Self Ref Ptr这些模板参数&#xff1f;为什么是试图从non_const转变为const&#xff0c;而不是const转为non_const如何解决 为什么说能加con…

vscode 乱码解决

windows 10 系统 vs code 编译运行和调试 C/C_vscode windows编译_雪的期许的博客-CSDN博客 VS Code默认文件编码时UTF-8&#xff0c;这对大多数情况是没有问题的&#xff0c;却偏偏对C/C有问题。如果以UTF-8编码保存C/C代码&#xff0c;那么只能输出英文&#xff0c;另外使用…