2025杭电多校1

2025杭电多校第一场 树上lcm、子序列、传送门个人题解 算法题目摘要 1. 带颜色约束的最短路问题 算法:Dijkstra算法 关键点:处理边颜色约束的最短路问题,每个节点维护到达该节点的最短路径边颜色集合 思路:在Dijkstra过程中,根据前驱边的颜色决定是否增加额外开销,使用优先队列和集合维护最短路径信息 2. 排列子序列问题 算法:贪心+双指针 关键点:利用排列特性,双指针遍历寻找满足条件的最大子序列长度 思路:从数组两端移动较小值的指针,计算满足条件的子序列长度,O(1)时间更新最大值 3. 树上LCM路径问题 算法:树形DP+质因数分解 关键点:将L 阅读详情

2025杭电多校1解题报告

update1:补充1001博弈(才学Anti_Nim)2025-7-24


1007 树上LCM

题意

给一颗n个结点组成的树,一个数x,每个结点有一个值,问有多少条路径满足该路径的LCM = x, 路径的LCM即路径上所有结点的LCM。
1 <= n <= 3e5, 2 <= x <= 1e7, a i a_i ai​ <= 1e9 。

观察

LCM的性质: l c m ( x 1 , x 2 , x 3 . . . , x n ) lcm(x_1,x_2,x_3...,x_n) lcm(x1​,x2​,x3​...,xn​) = p 1 k 1 ∗ p 2 k 2 ∗ p 3 k 3 ∗ . . . ∗ p m k m p_1^{k_1}*p_2^{k_2}*p_3^{k_3}*...*p_m^{k_m} p1k1​​∗p2k2​​∗p3k3​​∗...∗pmkm​​
其中: p i p_i pi​为质因子, k i k_i ki​为对应的指数最大。
所以路径上的点至少需要满足三个条件。

  1. a i a_i ai​对应的价值能整除x。
  2. a i a_i ai​进行质因数分解后的指数需要小于等于 k i k_i ki​
  3. 对任意的i,至少存在一个指数等于 k i k_i ki​
    x最大能达到1e7,其质因子个数cnt不超过7个。这个数很小,考虑在这里切入。

思路

那些不能整除x的点,肯定无法形成路径。我们可以拆开这些点,这样会形成一些森林。
设目标lcm x的质因子个数为sz,我们对每个点进行状态压缩: 1 << sz, 其中第i位为1,表示这个点第i个质因子的指数小于 k i k_i ki​,其中 k i k_i ki​为x分解质因数后对应的指数,为0则表示相等。设 F [ i ] F[i] F[i]表示状态为i的路径数, S [ i ] S[i] S[i]表示 i ⊂ 点状态 i\subset点状态 i⊂点状态的点数,易知状态为i的路径个数就是所有 点状态 ⊃ i 点状态\supset i 点状态⊃i的点组成的路径数,对于树上的路径计数,我们可以自然的想到使用并查集维护联通块,联通块上的路径数显然可以利用点的数量 O ( 1 ) O(1) O(1)求出。
现在我们得到了每个 F [ i ] , 0 < = i < 2 s z F[i],0<=i<2^{sz} F[i],0<=i<2sz。现在可以利用容斥原理求出答案。由容斥原理
a n s = ∑ i = 1 ( 2 s z ) − 1 ( − 1 ) popcount ( i ) ⋅ F [ i ] ans = \sum_{i=1}^{(2^{sz}) - 1} (-1)^{\text{popcount}(i)} \cdot F[i] ans=∑i=1(2sz)−1​(−1)popcount(i)⋅F[i]

代码

// 树上dp,sosdp
#include <bits/stdc++.h>
using namespace std;
#define int long long
constexpr int inf = 1e18;
constexpr int mod = 998244353;
constexpr int N = 2e5 + 10;

void solve() {
    int n, x;
    cin >> n >> x;
    vector<vector<int>> adj(n);
    for(int i = 1; i < n; ++i) {
        int u, v; cin >> u >> v;
        u--, v--;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    vector<int> a(n);
    for(int &x : a) cin >> x;
    vector<int> p, k;
    vector<int> bad(n, 0);
    bool ok = false;
    for(int i = 0; i < n; ++i) {
        if(x % a[i]) {
            bad[i] = 1;
        } else ok = true;
    }
    if(!ok) {
        cout << "0\n";
        return;
    }
    for(int j = 2; j * j <= x; ++j) {
        if(x % j == 0) {
            int cnt = 0;
            while(x % j == 0) {
                ++cnt; x /= j;
            }
            p.push_back(j), k.push_back(cnt);
        }
    }
    vector<int> vis(n, 0);

    if(x > 1) p.push_back(x), k.push_back(1);
    const int sz = (int)p.size();
    const int full = 1LL << sz;
    vector<array<int, 256>> dp(n);
    int ans = 0;
    auto dfs = [&] (auto && self, int u, int fa) -> void {
        vis[u] = 1;
        int now = 0;
        int temp = a[u];
        for(int i = 0; i < sz; ++i) {
            int cnt = 0;
            while(temp % p[i] == 0) temp /= p[i], ++cnt;
            now |= ((cnt == k[i]) * (1LL << i));
        }
        if(now == (full - 1)) ans++;
        dp[u].fill(0);
        dp[u][now] = 1;

        for(int &v : adj[u]) {
            if(v == fa || bad[v]) continue;
            self(self, v, u);

            array<int, 256> sup = dp[u];
            for(int i = 0; i < sz; ++i) {
                for(int j = 0; j < full; ++j) {
                    if(!(j & (1 << i))) sup[j] += sup[j | (1 << i)];
                } 
            }
            for(int i = 0; i < full; ++i) {
                int need = (full - 1) ^ i;
                ans += sup[need] * dp[v][i];
            }
            for(int i = 0; i < full; ++i) {
                dp[u][i | now] += dp[v][i];
            }
        }
    };
    for(int i = 0; i < n; ++i) {
        if(!bad[i] && !vis[i]) dfs(dfs, i, -1);
    }
    cout << ans << '\n';
}
signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t = 1;
    cin >> t;
    while(t--) {
        solve();
    }
    return 0;
}

提供一种莫比乌斯反演的方法

设 g ( x ) : l c m = x g(x):lcm=x g(x):lcm=x的路径数, f ( x ) : l c m ∣ x f(x):lcm|x f(x):lcm∣x的路径数。显然有
f ( x ) = ∑ d ∣ x g ( d ) f(x)=\sum_{d|x}g(d) f(x)=d∣x∑​g(d)
通过莫比乌斯反演有: g ( x ) = ∑ d ∣ x µ ( d ) ∗ f ( x d ) g(x)=\sum_{d|x}µ(d)*f(\frac{x}{d}) g(x)=d∣x∑​µ(d)∗f(dx​)
显然f(x)的数量可以通过dfs O ( n ) O(n) O(n)求出,发现1e7内的因子个数k不超过200,我们可以预处理出1e7内的莫比乌斯函数,对于每个因子d, O ( n ) O(n) O(n)计算 f ( d ) f(d) f(d),复杂度为 O ( k n + N ) O(kn+N) O(kn+N)可以接受。

代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
constexpr int inf = 1e18;
constexpr int mod = 998244353;
constexpr int N = 1e7;
// 设g(x): lcm = x的路径,f(x): lcm整除x的路径。
// 显然f(x) = 1 * g(x)
// 则 g(x) = µ * f(x)
// 线性筛预处理莫比乌斯函数µ即可.
int mu[N + 1], minp[N + 1], p[N + 1];
int cnt = 0;
void init() {
    mu[1] = 1;
    for(int i = 2; i <= N; ++i) {
        if(!minp[i]) p[++cnt] = i, mu[i] = -1;
        for(int j = 1; j <= cnt && i * p[j] <= N; ++j) {
            minp[i * p[j]] = p[j];
            if(i % p[j] == 0) {
                mu[i * p[j]] = 0;
                break;
            }   
            mu[i * p[j]] = -mu[i];
        }
    }
}
void solve() {
    int n, x;
    cin >> n >> x;
    vector<vector<int>> adj(n);
    for(int i = 1; i < n; ++i) {
        int u, v; cin >> u >> v;
        u--, v--;
        adj[u].push_back(v), adj[v].push_back(u);
    }
    vector<int> a(n);
    for(int &x : a) cin >> x;
    vector<int> ok(n);
    vector<int> siz(n);
    int res = 0;
    auto dfs = [&](auto &&self, int u, int fa) -> void {
        siz[u] = ok[u];
        for(int v : adj[u]) {
            if(v != fa) self(self, v, u), siz[u] += siz[v];
        }
        if(ok[u] && (fa == -1 || !ok[fa])) res += siz[u] * (siz[u] + 1) / 2;
        if(!ok[u]) siz[u] = 0;
    };
    auto cal = [&](int y) -> int {
        for(int i = 0; i < n; ++i) {
            ok[i] = (y % a[i] == 0);
        }
        res = 0;    
        dfs(dfs, 0, -1);
        return res;
    };
    int ans = 0;
    for(int i = 1; i <= x; ++i) {
        if(x % i == 0 && mu[i]) {
            ans += mu[i] * cal(x / i);
        }
    }
    
    cout << ans << '\n';
}
signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    init();
    int t = 1;
    cin >> t;
    while(t--) {
        solve();
    }
    return 0;
}

1001 博弈

前置知识:Nim和anti_Nim
我们记 T = ⨁ i = 1 n x i T=\bigoplus_{i=1}^{n}x_i T=⨁i=1n​xi​
对于Nim游戏有:若 T = 0 T=0 T=0则必败,否则必胜。
对于anti_Nim游戏分两种情况:
如果所有堆全部为1,则奇败偶胜。
至少有一堆大于1,则 T = 0 T=0 T=0必败,否则必胜。

题意

给 n n n个房间,每个房间有 k k k堆石头,具体的每一堆有 k i k_i ki​堆石头, A l i c e , B o b Alice,Bob Alice,Bob可以轮流在任意房间取第任意堆的任意个石头,最后无法取石头的输掉游戏。规定必须在一个房间取完才可以去另外一个房间取, A l i c e , B o b Alice,Bob Alice,Bob都以最优状态取,但是 A l i c e Alice Alice 可以规定房间顺序,问有多少种房间的排列让 A l i c e Alice Alice必胜,答案对1e9 + 7取模。

Hint1:先弱化问题,考虑所有房间的所有堆都只有1个石头,这个问题比较显然。我们定义奇数房间为有奇数个堆的房间,反之亦然。当有奇数个奇数房间时,必胜,反之必败。
Hint2:偶数房间显然对答案没有影响,因为这不会反转先后手。
Hint3:现在考虑存在房间里面至少有一个多于一个石头的堆。这个是否会对先后手反转有一定影响?

题解

全为1的情况已经判完。现在考虑不全为1的同时不考虑偶数房间,因为它对答案没有影响我们可以随便放。有两种可能一个是 T = 0 T=0 T=0的房间,我们定义这种房间为坏房间,反之为好房间。如果我们碰到的第一个不全为1的房间为好房间,我们发现无论是Nim还是anti_nim,它都是必胜的,即先手可以决定后面的出手顺序,这就是必胜态,故它前面的奇数房间不能反转出手顺序,即前面只能有偶数个奇数房间。反之,如果我们碰到的第一个不全为1的房间为坏房间,我们发现无论是Nim还是anti_nim,它都是必败的,即后手可以决定后面的出手顺序,这就是必败态,故它前面的奇数房间必须要反转出手顺序,即前面得有奇数个奇数房间来进行反转。
我们考虑枚举前面有多少个奇数房间统计答案。

代码

#include <bits/stdc++.h>
using namespace std;
#define int long long
constexpr int inf = 1e18;
constexpr int mod = 1e9 + 7;
constexpr int N = 1e6 + 10;
int qpow(int base, int index) {
    int res = 1;
    while(index) {
        if(index & 1) res = res * base % mod;
        base = base * base % mod;
        index >>= 1;
    }
    return res;
}
int f[N];
void fac() {
    f[0] = 1;
    for(int i = 1; i < N; ++i) {
        f[i] = i * f[i - 1] % mod;
    }
}
int comb(int x, int y) {
    return f[x] * qpow(f[y], mod - 2) % mod * qpow(f[x - y], mod - 2) % mod;
}
void solve() {
    int n;
    cin >> n;
    array<int, 4> cnt = {};
    for(int i = 0; i < n; ++i) {
        int k; cin >> k;
        bool ok = true;
        int s = 0;
        for(int j = 0; j < k; ++j) {
            int x; cin >> x;
            s ^= x;
            if(x > 1) ok = false;
        }
        if(ok) {
            if(s) cnt[0]++;
            else cnt[1]++;
        } else {
            if(s) cnt[2]++;
            else cnt[3]++;
        }
    }
    if(cnt[0] + cnt[1] == n) {
        if(cnt[0] & 1) {
            cout << f[n] << '\n';
        } else cout << "0\n";
        return ;
    }
    // 放多少个奇数在前面
    int ans = 0;
    for(int i = 0; i <= cnt[0]; ++i) {
        int temp = 1;
        if(i & 1) {
            temp = f[i] * comb(cnt[0], i) % mod * cnt[3] % mod;
            temp = temp * f[cnt[2] + cnt[3] - 1 + cnt[0] - i] % mod;
        } else {
            temp = f[i] * comb(cnt[0], i) % mod * cnt[2] % mod;
            temp = temp * f[cnt[2] + cnt[3] - 1 + cnt[0] - i] % mod;
        }
        ans = (ans + temp) % mod;
    }
    // 偶数随便放。
    for(int i = 1; i <= cnt[1]; ++i) {
        ans = (ans * (n - cnt[1] + i)) % mod;
    }
    cout << ans << '\n';
}
signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    fac();
    int t = 1;
    cin >> t;
    while(t--) {
        solve();
    }
    return 0;
}
ST电机库实战:从状态机到稳健启动流程的深度解析 本文深度解析了ST电机库中状态机的核心作用与稳健启动流程。状态机作为电机控制的“交通指挥官”,通过IDLE、CHARGE_BOOT_CAP、ALIGNMENT等一系列状态的严格跳转,确保了永磁同步电机(PMSM)和直流无刷电机(BLDC)的安全启动与可靠运行,是避免硬件损坏和实现平稳控制的关键。 阅读详情

相关推荐

PADS安装教程(超详细)

声明:个人实践 一、工具准备 pads9.5完整破解版百度网盘提取码【wjx9】 链接:https://pan.baidu.com/s/1pIP6BJO435ssmF7Hjwyz8A 提取码:wjx9 安装环境:win10 64位 二、开始解压安装 关闭杀毒,exe以管理员身份运行 点击【skip】,不然又得licese 点击【agree】 点击【modify】 设置安装的工具、路径及工程路径 设置完成后,开始【install】 在之后注册。 将Crack复制到PADS安装目录

qq_42057393的博客 5万+

2025“钉耙编程”中国大学生算法设计暑期联赛(1)1007 树上LCM

两条路径合并的时候,需要找到超集和,用高维前缀和可以解决。的过程,其实就是针对所有数质因数分解后的质因子指数取。并不包含,那么无论增加多少数,只要包含原来的那个数,大致题意:给定一棵树,点有权值。,求有多少条简单路径满足:路径上的点的。除此之外,如果某个数包含某个质因子。如果有一条简单路径,其上所有点或和。,这四个数分解结果分别为。分解后对应质因子的指数,首先需要知道,多个数求。的质因子的个数不会超过。个质因子指数恰好等于。

m0_55592958的博客 363

JAVA + 海康威视SDK + FFmpeg+ SRS 实现海康威视摄像头二次开发

海康威视SDK接入方案摘要 本文介绍了使用海康威视官方SDK开发物联网平台摄像头接入功能的完整方案。系统采用Java后端集成HCNetSDK控制摄像头,通过FFmpeg将RTSP流转为RTMP推送到SRS流媒体服务器,前端基于HTTP-FLV协议实现视频播放。文章详细说明了开发准备工作,包括SDK下载、SRS部署、FFmpeg安装等关键步骤,并提供了数据库表设计和接口定义。核心部分展示了如何集成海康SDK,包括提取必要代码、加载DLL文件、配置打包插件等具体实现细节,最终形成了一套支持实时预览、回放和下载的

2401_83057947的博客 2263

jzoj3519-灵能矩阵【LCM,树形dp】

正题 题目大意 一棵树,每个叶子节点有权值,每个点的权值是它这棵子树中的所有叶子节点权值之和。可以减少叶子节点的值,要求减少最少的值使得对于每个点,它的所有子节点的权值都相等。 解题思路 如果将叶子节点的深度优先访问顺序排好,那么就是一个序列。对于这个序列,我们只可以区间减少。那么我们可以先将一个区间减到满足要求,再考虑更大的区间。 对于每个点我们先不考虑原本权值。我们对于每个点我们构建一种系...

QuantAsk 550

天线学习笔记——HFSS简单阵列天线

在HFSS15.0版本中使用 Radiation --> Antenna Array Setup 设置天线阵列的参数时的设计列表如下: 值得注意的是,在该版本中所定义的是:第一个阵元的位置坐标(First Cell Position)、阵元之间的间距(Directions)和阵元的数量(Number of Cells) 这些参数。 在ANSYS中的HFSS仿真中定义天线阵列如下: 与老版本不同的是:中心点坐标(Center Position)和布局设置(Layout Setting)。在布局设置中

Ethan的博客 1万+

Openclaw第5章 知识库管理

💡:学会使用 OpenClaw构建个人知识库系统,实现网页文章存档、GitHub项目管理、论文笔记整理和跨设备同步。

Maynor的博客 775

【暑期多校补题记录】2025牛客多校(1)(2) 杭电多校(1)

本文发布于博客园,会跟随补题进度实时更新,若您在其他平台阅读到此文,请前往获取更好的阅读体验。

weixin_40327704的博客 192

如何使用VNC对openEuler系统进行远程图形化操作

本文详细介绍了在openEuler系统中配置VNC远程图形化操作的方法。主要内容包括:1)服务端配置:安装GNOME图形界面和TigerVNC服务,创建VNC用户并设置密码,配置VNC服务启动脚本;2)客户端连接:使用VNC Viewer等工具连接服务器;3)常见问题解决方法。通过5901端口建立连接后,用户可远程操作openEuler图形界面,适用于需要图形化管理的场景。

2501_93651177的博客 314

【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(5)

至于为什么是对 \(5\) 取模呢,其实打表过程也是有迹可循的,打表打着打着就会出现一些抉择是 Kc0 拿 \(1\) 小凯拿 \(4\) 和 Kc0 拿 \(4\) 小凯拿 \(1\),感觉多多少少和这个有关系,至于严谨证明就暂时想不到了。当 \(n \% 5 = 1\) 并且 \(n \neq 1\) 时,有 \(1 - (1/2) ^ {n / 5}\) 的概率获胜。当 \(n \% 5 = 4\) 时,有 \(1 - (1/2) ^ {n / 5 + 1}\) 的概率获胜。

weixin_55010563的博客 408

PR工具timing report中setup time的计算过程

然后去pr工具里报告report_delay_calculation/reportDelayCalculation -from related_pin -to constraint_pin。这里constraint pin就是D pin (D0 D1 D2 D3),related pin就是 CK pin。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 455

基于STM32L4XX 、HAL库的TMP144YFFR数字温度传感器驱动应用C语言程序设计

define TMP144_ADDRESS 0x00 // 默认为全局地址,用于单器件或MDA命令。#define TMP144_CMD_READ_TEMP 0x00 // 读取温度寄存器命令。if (temp_raw & 0x800) { // 判断第11位(符号位)

PP_Cottage的博客 91

【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)

比赛链接 博客园原文链接(防盗) 开题情况 还是很吃教训的一场比赛,被博弈论硬控两小时(很好的一个博弈论题),dijkstra被卡map,最终三题。 自己不会的东西还是太多了,还得多多练习多多长见识。 1001 - 签到 题如其名,签到题,问给出的字符串第一次出现的位置。 点击查看代码 void solve() { int n;cin >> n; string s...

weixin_40410887的博客 581

2023年GESP12月认证C++五级真题解析

例如,如果a=4,那么4是最⼩的幸运数,而1不是,但我们可以连续对1做3次+1操作,使其变为4,所以我们可以说,1幸运化后的结果是 4。【题目大意】给一个完全平方数的标准,推导出哪些是超级幸运数,然后判断N个数字中,哪些是超级幸运数,是的输出“lucky”,不是的输出离该数字最近的比它大的数字。前一个数字,下标是j的数字是偶数,后面的数字下标是j+1的是奇数,按照要求,偶数在奇数的后面,要交换。A函数时间复杂度是O(n/2),B函数算法是O(sqrt(n)),大部分情况后者是优的,值更小。

lan_in的博客 1007

2025杭电多校第四场 回忆与展望、量子弹弓 个人题解

本文包含两道算法题的题解。第一题《量子弹弓》考察贪心策略和图论应用,通过分析点的排列和弹弓强度,构建满足条件的路径。关键在于统计强度为1的点和计算其他点对返程的贡献。第二题《回忆与展望》运用数学和贪心思想,比较两种策略(增减交替和单调不减)在不同情况下的收益,通过桶排序统计上升段长度并选择最优策略。两题均涉及特殊情况的处理,展示了贪心算法在特定场景下的巧妙应用。

CUC-MenG的博客 1318

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(9)

1.【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)2.【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(2)3.【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(3)4.【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(4)5.【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(5)6.【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(6)7.

weixin_41305635的博客 85

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

7.22~7.25训练博客

本次博客所有题目来自2025牛客多校第二场,第三场,以及杭电多校第一场第三场。选取其中我觉得有意思的题目。

caiscal的博客 631

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【暑期多校补题记录】2025牛客多校(3)(4) 杭电多校(2)(3)

本文发布于博客园,会跟随补题进度实时更新,若您在其他平台阅读到此文,请前往博客园获取更好的阅读体验。 跳转链接:https://www.cnblogs.com/TianTianChaoFangDe/p/19007314 开题情况 7.22牛客多校3 : 5题 - ADEFJ 7.24牛客多校4 :

cmdos的专栏 98

2025暑假杭电多校(2)个人做题记录

本文记录了2025年杭电多校第二场竞赛的部分解题情况,更新至9月3日,包含A、B、C、F、H、I、K、L、G、J题的解法。A题通过生成函数分解骰子组合概率,B题利用位运算性质构造最短路径,C题通过概率分析和动态规划处理图上的期望计算,其中涉及多项式的分解、位运算优化和概率期望的复杂计算。代码实现注重效率优化和边界条件处理,部分题目需要特殊技巧如对数比较或大整数运算。整体展现了算法竞赛中对数学工具和优化技巧的综合运用。

weixin_51060666的博客 717

2025杭电多校第九场 乘法逆元、阿斯蒂芬、计算几何 个人题解

这篇文章介绍了两个算法题解: 计算几何题目:处理不自交折线时,通过向量叉乘判断方向性(左转/右转),并根据多边形面积正负确定顺时针/逆时针方向。关键点在于使用整数运算避免精度问题,代码中实现了向量运算和方向判断逻辑。 强连通分量题目:通过Tarjan算法缩点,建立反向图后DFS遍历,利用三种状态标记(1-含缩点有能量,2-无缩点有能量,3-无能量)来统计需要沉寂的节点数。重点处理了能量在连通分量中的传播特性。 两题都涉及图论和几何算法,强调了整数运算和状态标记的应用技巧。

CUC-MenG的博客 1378

2025杭电多校第八场 最有节目效果的一集、最自律的松鼠、最甜的小情侣、最努力的活着 个人题解

本文介绍了两个算法题的解法思路。第一篇《最努力的活着》探讨了在给定约束条件下如何高效计算最大和的问题。通过数学推导和贪心策略,利用__int128处理大数运算,并采用公式优化避免了暴力模拟的时间复杂度问题。第二篇《最甜的小情侣》则针对带修改的环形序列问题,提出基于线段树维护变换矩阵的DP优化方案,通过重定义矩阵运算规则来支持单点修改和区间查询,在O(log n)复杂度内完成操作。两篇解法都体现了将数学推导与数据结构相结合的优化思路。

CUC-MenG的博客 1196

【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(4)

1.【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)2.【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(2)3.【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(3)4.【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(4)5.【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(5)6.【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(6)7.

weixin_40772579的博客 177

【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(6)

1.【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)2.【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(2)3.【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(3)4.【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(4)5.【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(5)6.【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(6)7.

weixin_36910580的博客 82

2025杭电多校第七场 矩形框选、伤害冷却比 个人题解

本文包含两道算法题的解题思路和代码实现: 伤害冷却比问题(数学优化): 题目要求计算给定区间内函数f(x)的最大值,其中f(x) = x*(⌊K/(Nx)⌋+1) 通过数学推导找到关键点x=a/n(n为整数),确定区间内可能的极值点 比较端点和极值点处的函数值,求出最大结果 使用约分处理最终输出 矩形框选问题(几何+数据结构): 需要在平面上找到能框住最多点的固定面积矩形 将数点问题转化为矩形重叠区域问题 使用扫描线算法配合线段树维护区间最大值 枚举所有可能的矩形形状(长宽组合),对每种情况使用线段树处理

CUC-MenG的博客 1289

2025杭电多校第五场 四角洲行动、“合理”避税、随机反馈、k-MEX 个人题解

这里提供三篇题解的摘要: k-MEX组合数学题: 题目要求计算给定条件下mex值的期望 通过组合数推导得出公式:E = k/(n-k+1) 使用费马小定理求逆元完成模运算 时间复杂度O(t*logMOD) 随机反馈概率DP: 动态规划状态dp[i]表示从第i分钟开始的最小期望罚时 转移方程考虑交题和不交题两种情况的最优选择 倒序DP处理,初值dp[n]=n 注意避免混用printf和cin/cout 合理避税二分贪心: 二分答案判断最少月份是否可行 贪心策略:尽可能多次取k元,然后处理余数 用优先队列处理剩

CUC-MenG的博客 954
上一篇: Codeforces Round 1035 (Div. 2)题解 (折线可达定理?)
下一篇: 算法竞赛中的hash技巧(个人收集使用)
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值