Codeforces Round #911 (Div. 2) A~E

《Zephyr OS 入门与实战》第15章:LoRaWAN 集成 【代码】《Zephyr OS 入门与实战》第15章:LoRaWAN 集成。 阅读详情

A.Cover in Water(思维)

题意:

有一个1×n1 \times n1×n的水池,里面有些格子可以加水,有些格子是被堵上的,你可以进行以下两种操作:

  • 1.往一个空的格子里加水

  • 2.移除一个有水的格子中的水,并将这些水添加到另一个格子中

且如果两个有水的格子中间都是空格子,那么水将覆盖中间所有的空格子。

问最少进行多少次操作1,才能使所有空格子中均有水。

分析:

不难发现,只要出现一段长度大于2的连续空格子,那么就可以在这段格子两端各使用一次操作1,然后这段格子中间就全部被水覆盖了,且无论怎么使用操作2,由于两端均有水,取完之后格子也不会变空,可以无限取,即一定只需要两次操作1.

如果没有任意一段连续的空格子长度大于2,那么只能对每个格子使用一次操作1,才能使所有格子都包含水,此时的操作1使用次数就是空格子的个数。

代码:

#include <bits/stdc++.h>
using namespace std;


void solve() {
    int n;
    string s;
    cin >> n >> s;
    int ans = 0, cnt = 0;
    for (int i = 0; i < n; i++) {
        if (s[i] == '.') {
            cnt++;
            if (cnt > 2) {
                cout << 2 << endl;
                return;
            }
        } else {
            ans += cnt;
            cnt = 0;
        }
    }
    ans += cnt;//不要忘了加上最后一段
    cout << ans << endl;
}

int main() {
    int Case;
    cin >> Case;
    while (Case--) {
        solve();
    }
    return 0;
}

B.Laura and Operations(思维)

题意:

给出aaa个111,bbb个222,ccc个333,每次可以选择1∼31 \sim 31∼3中的两个不同数字,消除这两个数字,并产生一个新的数字,这个产生的数字与消除的两个数字均不同,问有没有方法可以使最后只剩下1,2,31, 2, 31,2,3中的一种(能否剩下1,2,31, 2, 31,2,3的可能性单独输出)

分析:

首先,如果想要剩下的全部都是111,那么就需要先将222和333的数量变为相同的,再通过一直消除222和333使得只剩下111。

那么要怎么让222和333数量相同呢?

可以先消除111和出现较多的数,不难发现,如果此时没有111,是无法完成消除操作的,此时无解。

而每次消除111和出现较多的数字,每次进行消除,可以使较大出现次数和较小出现次数之间的差减少2(不用担心1是否不够用,通过消除222和333可以再获得111),那么如果这两个数的出现次数差为奇数,是无法将这两个数完全消除的,此时也是无解。

结论:只要另外两个数的差为偶数,且满足以下两个要求之一,就可以完成消除操作:

  1. 想要留下的数字出现次数不为0

  2. 需要消除的两个数字出现次数已经相同

代码:

#include <bits/stdc++.h>
using namespace std;

void solve() {
    int a, b, c;
    cin >> a >> b >> c;
    if (abs(b - c) % 2 == 0 && (min(c, b) != 0 || a != 0)) {
        cout << 1;
    } else {
        cout << 0;
    }
    if (abs(a - c) % 2 == 0 && (min(a, c) != 0 || b != 0)) {
        cout << ' ' << 1;
    } else {
        cout << ' ' << 0;
    }
    if (abs(a - b) % 2 == 0 && (min(a, b) != 0 || c != 0)) {
        cout << ' ' << 1;
    } else {
        cout << ' ' << 0;
    }
    cout << endl;
}

int main() {
    int Case;
    cin >> Case;
    while (Case--) {
        solve();
    }
    return 0;
}

C.Anji’s Binary Tree(树形DP)

题意:

有一棵二叉树,树上每个节点均写着"ULR"中的一个字符,这三个字符的含义如下:

  • 'U':当你走到这个节点,你需要向这个节点的父节点移动

  • 'L':当你走到这个节点,你需要向这个节点的左孩子移动

  • 'R':当你走到这个节点,你需要向这个节点的右孩子移动

问:你最少需要修改多少次节点上的字符,能使你从根节点出法到达叶节点。

分析:

  • 当前节点为'U':想要向叶节点移动,遇到'U'就需要修改,此时不需要考虑节点被修改成了什么。

  • 当前节点为'L':此时往左子树走不需修改次数,往右子树走需一次修改次数,记录两者中的较小值

  • 当前节点为'R':此时往右子树走不需修改次数,往左子树走需一次修改次数,记录两者中的较小值

从根节点开始搜索,到达叶节点返回,记录最小的修改次数即可。

代码:

#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f

int n, L[300005], R[300005];
string s;

int dfs(int x) {
    if (x == 0) return INF;//走到空节点了,返回极大值
    if (L[x] == 0 && R[x] == 0) return 0;//走到叶节点,返回0
    if (s[x - 1] == 'U') {
        return min(dfs(L[x]), dfs(R[x])) + 1;
    } else if (s[x - 1] == 'L') {
        return min(dfs(L[x]), dfs(R[x]) + 1);
    } else {
        return min(dfs(L[x]) + 1, dfs(R[x]));
    }
}

void solve() {
    cin >> n >> s;
    for (int i = 1; i <= n; i++) cin >> L[i] >> R[i];
    cout << dfs(1) << endl;
}

int main() {
    int Case;
    cin >> Case;
    while (Case--) {
        solve();
    }
    return 0;
}

D.Small GCD(容斥)

题意:

给出一个包含nnn个元素的数组和一个函数f(a,b,c)=gcd(a,b)f(a, b, c) = gcd(a, b)f(a,b,c)=gcd(a,b),其中a<b<ca < b < ca<b<c。

求:∑i=1n∑j=i+1n∑k=j+1nf(ai,aj,ak)\sum\limits_{i = 1}^{n}\sum\limits_{j = i + 1}^{n}\sum\limits_{k = j + 1}^{n}f(a_i, a_j, a_k)i=1∑n​j=i+1∑n​k=j+1∑n​f(ai​,aj​,ak​)。

分析:

由于每轮取得三个数实际上只有两个较小数字会对答案产生影响,因此可以先对输入的元素进行排序。

然后使用两层for循环对ai,aja_i,a_jai​,aj​进行枚举,此时的gcd(ai,aj)gcd(a_i, a_j)gcd(ai​,aj​)的答案对于任意一个kkk都是成立的,即ai,aja_i,a_jai​,aj​对答案产生的贡献为gcd(ai,aj)×(n−j)gcd(a_i, a_j) \times (n - j)gcd(ai​,aj​)×(n−j)。

但是,此时的时间复杂度为O(n2)O(n^2)O(n2),是无法通过本题的,因此,需要对算法进行优化

优化

先考虑所有因数对答案的贡献,那么只需一层for循环,遍历到aja_jaj​时,如果aja_jaj​的因数bbb在前面出现过,那么这个因数对答案的贡献就是在前面出现的次数(包含该因数的aia_iai​个数)乘上后面的数字个数,即:cnt[b]×(n−i)cnt[b] \times (n - i)cnt[b]×(n−i)。

而对于因数分解的时间复杂度是比较慢的,需要先对10510^5105以内的数预处理所有因子。

求完所有因子产生的贡献后,需要考虑实际上求出的贡献计算了很多重复的情况,如因子为222的贡献中包含了所有222的倍数的贡献。需要将这些重复计算的贡献减去。

此时可以从后往前对因子进行遍历,每次先将所有由倍数产生的贡献减去,然后计算当前因子产生的贡献,即当前因子的出现次数乘上因子的值。

代码:

#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
typedef long long ll;

const int N = 1e5 + 5e2;

int n, a[N];
ll sum[N], cnt[N];

vector<int> fact[N];

void init() {
    for (int i = 1; i < N; i++) {
        for (int j = i; j < N; j += i) {
            fact[j].push_back(i);//预处理因子
        }
    }
}

void solve() {
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> a[i];
    sort(a + 1, a + n + 1);
    for (int i = 1; i <= n; i++) {
        int len = fact[a[i]].size();
        for (int j = 0; j < len; j++) {
            sum[fact[a[i]][j]] += cnt[fact[a[i]][j]] * (n - i);
            cnt[fact[a[i]][j]]++;
        }
    }
    ll ans = 0;
    for (int i = a[n]; i >= 1; i--) {
        for (int j = i + i; j < N; j += i) {
            sum[i] -= sum[j];
        }
        ans += sum[i] * i;
    }
    cout << ans << endl;
}

int main() {
    init();
    int Case;
    cin >> Case;
    while (Case--) {
    //初始化
        memset(sum, 0, sizeof (sum));
        memset(cnt, 0, sizeof (cnt));
        solve();
    }
    return 0;
}

E. Transitive Graph(图论)

题意:

给定一个有向图,点有点权,重复进行如下操作:如果存在边a−>ba->ba−>b ,b−>cb->cb−>c但不存在a−>ca->ca−>c边 ,则添加边a−>ca->ca−>c。直到不存在这样的(a,b,c)(a,b,c)(a,b,c)。做完操作后,询问点权之和最小且经过点数最多的简单路径的长度以及点权之和。

分析:

可以用强连通分离缩点,可以发现每个强连通分量在传递闭包中是一个完全图,因为我们需要的是最长路,所以只要走到这个强连通分量就必须走完分量中的所有点。
我们先用tarjantarjantarjan进行缩点,原图中的简单路径就是缩点后的DAGDAGDAG的路径,在DAGDAGDAG上跑双关键字的dpdpdp即可。

代码:

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int maxn = 2e5 + 5;
int ver[maxn], next1[maxn], head[maxn], dfn[maxn], low[maxn];
int stack1[maxn], vis[maxn], c[maxn];
vector<int> scc[maxn]; // 强连通分量
ll tot, top, num, cnt;
ll a[maxn];
vector<int> g[maxn];
ll sum[maxn];
ll dis[maxn];
struct node {
    int sum, num;
} aa[maxn];

void add(int x, int y) {
    ver[++tot] = y;
    next1[tot] = head[x];
    head[x] = tot;
}

int n, m;
ll dp[maxn];

void init() {
    num = 0;
    top = 0;
    for (int i = 0; i <= cnt; i++)
        scc[i].clear();
    cnt = tot = 0;
    for (int i = 1; i <= n; i++) {
        sum[i] = 0;
        dis[i] = 0;
        dp[i] = 0;
        head[i] = 0;
        g[i].clear();
        dfn[i] = low[i] = stack1[i] = vis[i] = c[i] = 0;
    }
}

void tarjan(int x) {
    num++;
    dfn[x] = low[x] = num;
    top++;
    stack1[top] = x;
    vis[x] = 1;
    for (int i = head[x]; i; i = next1[i]) {
        int y = ver[i];
        if (!dfn[y]) {
            tarjan(y);
            low[x] = min(low[x], low[y]);
        } else if (vis[y]) {
            low[x] = min(low[x], dfn[y]);
        }
    }
    if (dfn[x] == low[x]) {
        cnt++;
        int tmp;
        do {
            tmp = stack1[top--];
            vis[tmp] = 0;
            c[tmp] = cnt; // 每个点所属于的强连通分量编号
            scc[cnt].push_back(tmp);
            sum[cnt] += a[tmp];
        } while (x != tmp);
    }
}

int main() {
    int t;
    cin >> t;
    while (t--) {
        cin >> n >> m;
        init();
        for (int i = 1; i <= n; i++) {
            cin >> a[i];
        }
        for (int i = 1; i <= m; i++) {
            int x, y;
            cin >> x >> y;
            add(x, y);
        }
        for (int i = 1; i <= n; i++) {
            if (!dfn[i])
                tarjan(i);
        }
        // cnt就是强连通块数量
        for (int x = 1; x <= n; ++x) {
            for (int i = head[x]; i; i = next1[i]) {
                int y = ver[i];
                if (c[x] != c[y]) {
                    g[c[x]].push_back(c[y]);
                }
            }
        }
        for (int i = 1; i <= cnt; i++) {
            aa[i].sum = sum[i];
            aa[i].num = scc[i].size();
        }
        for (int i = 1; i <= cnt; i++) {
            // 遍历出边

            if (g[i].empty()) {
                dis[i] = scc[i].size();
                dp[i] = sum[i];
            } else
                for (auto u: g[i]) {
                    if (dis[u] + scc[i].size() > dis[i]) {
                        dis[i] = dis[u] + scc[i].size();
                        dp[i] = dp[u] + sum[i];
                    } else if (dis[u] + scc[i].size() == dis[i]) {
                        dp[i] = min(dp[i], dp[u] + sum[i]);
                    }
                }
        }
        ll mlen = 0;
        for (int i = 1; i <= cnt; i++)
            mlen = max(mlen, dis[i]);
        ll ans = 1e18;
        for (int i = 1; i <= cnt; i++)
            if (dis[i] == mlen)
                ans = min(ans, dp[i]);
        cout << mlen << " " << ans << endl;
    }
    return 0;
}

学习交流

以下学习交流QQ群,群号: 546235402,大家可以加群一起交流做题思路,分享做题技巧,欢迎大家的加入。

HALCON机器视觉之结合LMI Gocator 5504进行手机折叠屏异物、折痕和胶体检测(基于C# + HALCON) 手机折叠屏是一种创新的屏幕技术,它允许屏幕在一定程度上进行折叠,从而在便携性和屏幕尺寸之间取得平衡。这种屏幕通常由多层材料组成,包括柔性显示层、保护层和胶水层等。本文将详细介绍如何使用C#编程语言,结合HALCON和LMI Gocator 5504来实现手机折叠屏的异物、折痕和胶体检测。 阅读详情

相关推荐

2.4G射频微带线阻抗匹配设计实战(WiFi/BLE)

本文深入探讨了2.4G射频微带线阻抗匹配在WiFi/BLE产品开发中的关键作用。文章详细解析了共面波导微带线结构,提供了基于SI9000工具的阻抗计算实战指南,并总结了不同PCB板厚下的设计参数对照表。同时,文章分享了PCB布局布线、与板厂沟通以及天线匹配调试等核心避坑经验,旨在帮助硬件工程师构建从射频芯片到天线的稳定高效传输通道。

j0k1l2m3n的博客 367

Codeforces Round 911 (Div. 2)

当我们找到一个无子节点的叶子节点时,记录到达该点的答案,并取最小。题意:小凯从一颗二叉树的顶点1开始,树的每个节点都有一个字符代表可以向左子节点/右子节点/父节点移动,现在小凯要移动到任一一个没有子节点的叶子节点,他可以改变一个节点的字符来到达叶子节点,他操作的最小次数是多少。题意:给出一个字符串,#代表堵塞的部分,'.'代表待填充水的部分,两边有水的点可以自动被填充。思路:对于一个大于3的连续的待填充的部分,只需要填充两端即可,只要有一个这样的部分,其余部分都可以通过移动该部分除了两边的水进行填充操作。

maisui12138的博客 297

SRAM ECC原理与应用:从汉明码到高可靠嵌入式系统设计

在嵌入式系统与高可靠性计算领域,内存数据完整性是系统稳定运行的基石。软错误(Soft Error)由宇宙射线或芯片内部粒子引发,可能导致存储单元发生位翻转,进而引发程序跑飞或数据损坏。为应对这一物理层挑战,错误校验与纠正(ECC)技术应运而生,其核心原理基于扩展汉明码,通过增加校验位实现单错误纠正、双错误检测(SECDED)能力。这项技术通过硬件透明纠错,在提升系统可靠性的同时,几乎不影响访问性能。在汽车电子、工业控制及航空航天等对安全性要求极高的场景中,ECC已成为保障长期稳定运行的关键硬件机制。本文聚焦

weixin_28728265的博客 529

Codeforces Round 911 (Div. 2)(C dp D gcd 分解+容斥 E tarjan+dp)

然后因为是拓扑序大的 scc_cnt小,因为tarjan是先到底部的,底部的点会先缩,再回溯到上面缩,所以dp直接从1开始即可。比如上面例子的f[2]要减去f[4] f[1]要减去f[1]减去f[2]减去f[4](这里的f[2]要先减去f[4]哦)通过一个调和级数求1到10w的每个数的因子(不是质因子哦,而是因子,比如16的因子有1 2 4 8 16)f[4]=1 f[2]=1 f[1]=1(因为只有两个数嘛,所以只有一对)然后我们可以求当前数的当前因子能和前面数的因子的总贡献。

qq_61657632的博客 824

5GCPE与4G物联网卡兼容实战:通过AT指令修改IMEI实现设备迁移

本文详细介绍了如何通过AT指令修改5GCPE设备的IMEI,实现4G物联网卡的设备迁移。从硬件准备、驱动安装到串口工具配置,再到具体的AT指令操作步骤,提供了全面的实战指南。文章还包含信号优化、APN设置等实用技巧,帮助用户顺利完成设备迁移并提升网络性能。

weixin_28684757的博客 629

基于Halium 9为小米平板4移植Ubuntu Touch:内核适配与驱动调试实战

在移动设备生态中,Linux内核作为核心,通过硬件抽象层(HAL)管理底层硬件驱动,为上层系统提供统一接口。其模块化设计允许深度定制,是实现跨平台移植的技术基础。Halium项目正是利用这一原理,构建了一个中间层,将安卓内核的硬件支持能力“翻译”成标准Linux发行版能识别的格式,从而在手机、平板等移动设备上运行Ubuntu Touch、postmarketOS等移动Linux系统,极大地拓展了老旧设备的再利用价值。这一技术为开发者提供了在常见安卓硬件上进行Linux系统开发与定制的可能,尤其在嵌入式与物联

weixin_42639246的博客 371

Codeforces Round 919 (Div. 2). Partitioning the Array同余的同余

当题目逻辑与取余有关时。。。

JK01WYX的博客 632

DIY必备:如何用N-MOS管搭建低成本DC有刷电机驱动电路(附原理图+避坑指南)

本文详细介绍了如何使用N-MOS管搭建低成本、高可靠性的DC有刷电机驱动电路。针对DIY爱好者,从核心原理、电路设计、元件选型到焊接调试,提供了完整的实战指南,并重点解析了续流二极管选型、栅极驱动设计等关键避坑要点,帮助读者成功驱动电机并确保电路稳定运行。

delta的博客 775

Codeforces Round 919 (Div. 2) E. Counting Binary Strings

个人练习记录

m0_73500785的博客 1236

[USACO2023-JAN-Bronze] T2 Air Cownditioning II 题解

[USACO2023-JAN-Bronze] T2 Air Cownditioning II题解

1652

多传感器标定:如何统一摄像头、雷达与IMU坐标?

多传感器标定:如何统一摄像头、雷达与IMU坐标?​ ,人工智能,计算机视觉,大模型,AI,本文详细阐述多传感器标定中统一摄像头、雷达与 IMU 坐标的方法。先介绍传感器坐标系统、坐标统一必要性及变换数学基础,再分述摄像头与雷达、IMU 与摄像头、IMU 与雷达的标定原理、步骤、参数计算及结果验证,还讲解了多传感器坐标统一的整体流程,分析了标定常见问题及解决办法,介绍了常用标定工具,结合实际案例说明应用,探讨了标定精度的影响因素、提升方法及发展趋势,为相关领域提供了全面的多传感器标定指导。​

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 12万+

Codeforces Round 919 (Div. 2) (A-D)

Codeforces Round 919 (Div. 2) (A-D)题解

qq_45809243的博客 1621

把 LLM 编排能力塞进 ABAP 系统里,ZLLM 仓库的工程价值与 SAP 落地场景

ZLLM项目将LLM应用开发中的常见工程问题引入ABAP原生环境,为SAP系统提供AI工作流构建能力。它类似ABAP版的LangChain,支持Chain组合、Prompt模板、状态传递等核心功能,强调纯ABAP实现、延迟执行以及与ABAP数据结构的深度集成。项目包含工厂类、LLM客户端、负载均衡器等模块,特别设计了能处理ABAP内表和结构的模板引擎,使业务数据可直接用于Prompt生成。通过Step和Flow机制支持复杂业务过程编排,并采用延迟执行和并行处理优化批量任务性能。该项目为ABAP开发者提供了在

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 61

Codeforces Round 911

Codeforces Round 911

青少年趣味编程 1097

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Codeforces Round 987

Codeforces Round 987

青少年趣味编程 1398

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

每日一题 第十六期 Codeforces Round 911 (Div. 2)

B. Laura and Operationstime limit per test: 2 secondsmemory limit per test: 256 megabytesinput: standard inputoutput: standard output Laura is a girl who does not like combinatorics. Nemanja will try to convince her otherwise.Nemanja wrote some digits on t

2301_80882026的博客 1086

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Codeforces Round 926

Codeforces Round 926

青少年趣味编程 1095

Codeforces Round 988

Codeforces Round 988

青少年趣味编程 1489

Codeforces Round 972

Codeforces Round 972

青少年趣味编程 1053

Codeforces Round 916

Codeforces Round 916

青少年趣味编程 1116

Codeforces Round 983

Codeforces Round 983

青少年趣味编程 863

Codeforces Round 936

Codeforces Round 936

青少年趣味编程 995

Codeforces Round 969

Codeforces Round 969

青少年趣味编程 724

Codeforces Round 980

Codeforces Round 980

青少年趣味编程 881

Codeforces Round 996

Codeforces Round 996

青少年趣味编程 674

Codeforces Round 928

Codeforces Round 928

青少年趣味编程 1261
上一篇: CodeTON Round #7 (Div. 1 + Div. 2) A~E
下一篇: AtCoder Beginner Contest 330 A~F
AC-Panda
博客等级 码龄5年 1736粉丝 191原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值