QBXT2025S刷题 Day1

news/2025/10/2 20:56:48/文章来源:https://www.cnblogs.com/SigmaToT/p/19123997

今天的题目

T1

\(90pts\)
赛时树状数组写挂了。
发现没有特判第一个数是 \(0\)
我的思路是,\(cnt[x]\) 表示对于所有的 \(h[i] \geq x\) 可以构成多少个区间。
先离散化。
对于当前 \(h[i]\),若 \(h[i - 1] < h[i]\),则 \(h[i - 1] + 1\)\(h[i]\)\(cnt\) 会加一,因为 \(i\) 是新区间的开始。
\(h[i - 1] \geq h[i]\), 则不会有任何的贡献,因为如果 \(i\) 存在,那么 \(i - 1\) 也会存在,所以 \(i\) 不是新区间的开始。
这个直接在树状数组上差分。
还要特判 \(h[1] = 0\)
代码:

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdio>
#define lowbit(x) x & (-x)using std::cin;
using std::cout;
const int N = 1e6 + 10;int n;
int max_val;
int h[N];
int b[N];
int re[N];
int sum[N];
std::vector<int> v;void add(int x, int val)
{for (; x <= max_val; x += lowbit(x))sum[x] += val;
}
int query(int x)
{int ret = 0;for (; x; x -= lowbit(x))ret += sum[x];return ret;
}
void read(int &x)
{x = 0;int f = 1;char c = getchar();while (!isdigit(c)){if (c == '-')f = -f;c = getchar();}while (isdigit(c)){x = x * 10 + c - '0';c = getchar();}x *= f;
}int main()
{read(n);for (int i = 1; i <= n; ++i){read(h[i]);v.push_back(h[i]);}std::sort(v.begin(), v.end());v.erase(std::unique(v.begin(), v.end()), v.end());for (int i = 1; i <= n; ++i){b[i] = std::lower_bound(v.begin(), v.end(), h[i]) - v.begin() + 1;re[b[i]] = h[i];}for (int i = 1; i <= n; ++i)max_val = std::max(max_val, b[i]);if (h[1] > 0){add(1, 1);if (b[1] + 1 <= max_val)add(b[1] + 1, -1);}for (int i = 2; i <= n; ++i){if (b[i - 1] < b[i]){add(b[i - 1] + 1, 1);if (b[i] + 1 <= max_val)add(b[i] + 1, -1);}}int max = 0;for (int i = 1; i <= max_val; ++i){int now = query(i);if (now > max)max = now;}cout << max << '\n';return 0;
}

T2

写了第一个分段。
这道题其实一眼数位 \(DP\)
\(\mathcal{AK\_Dream}\):这是一道简单题。
但是我不会。
先考虑 \(L = R\) 的情况。
\(dp[i][j]\) 表示,考虑到 \(i\),所有的后缀中,\(\%k\)\(j\) 的方案数。
\(dp[i + 1][(j * 10 + num[i]) \% k] += dp[i][j]\)
\(dp[i + 1][num[i] \% k] += dp[i][j]\)
同理,直接把这个转化一下就行了。
老师的代码:

#include <bits/stdc++.h>
#define N 50005
#define K 105
using namespace std;const int mod = 1000000007;
inline int qmod(int x) { return x < mod ? x : x - mod; }
inline void qadd(int &x, int y) { (x += y) >= mod ? (x -= mod) : 0; }char L[N], R[N];
int k, dp[2][N][K];
int tenc[N], upc[N];int DP(char *T, int d, int sum, bool up, bool zero)
{int ans = 0;if (d < 0){return sum == -2;}if (!zero && dp[up][d][sum + 2] != -1){return dp[up][d][sum + 2];}int mx = up ? T[d] - '0' : 9;for (int i = 0; i <= mx; i++){bool new_up = up && (i == mx), new_zero = zero && (i == 0);if (sum >= 0){int new_sum = (sum * 10 + i) % k;if (new_sum == 0){qadd(ans, DP(T, d - 1, -2, new_up, new_zero));}qadd(ans, DP(T, d - 1, new_sum, new_up, new_zero));}else if (sum == -1){if (!new_zero){qadd(ans, DP(T, d - 1, i % k, new_up, new_zero));if (i % k == 0){qadd(ans, DP(T, d - 1, -2, new_up, new_zero));}}qadd(ans, DP(T, d - 1, -1, new_up, new_zero));}else if (sum == -2){qadd(ans, DP(T, d - 1, -2, new_up, new_zero));}}if (!zero)dp[up][d][sum + 2] = ans;return ans;
}int calc(char *T, int len)
{memset(dp, -1, sizeof(dp));int ans = DP(T, len - 1, -1, true, true);return ans;
}void solve()
{scanf("%s %s %d", L, R, &k);int lenL = strlen(L), lenR = strlen(R);reverse(L, L + lenL);reverse(R, R + lenR);for (int i = 0; i < lenL; i++){if (L[i] != '0'){L[i]--;break;}L[i] = '9';}if (L[lenL - 1] == '0')--lenL;int ans = qmod(calc(R, lenR) - calc(L, lenL) + mod);printf("%d\n", ans);
}int main()
{int ttt;scanf("%d", &ttt);while (ttt--)solve();return 0;
}

T3

没有写 #include <vector>
本地编译过了。
\(25pts \to 0pt\)
这道题,先 \(dfs\)\(a\)\(b\) 的那条路径,然后路径上的每个点下面都会挂着一个子树,我们求出 \(maxd[x]\) = \(x\) 点在子树中最远走的路径长度。
如果小 \(a\) 走着走着走到了一个子树里,那么小 \(a\) 的答案肯定就是 \(maxd[a]\),而小 \(b\) 可以选择 \(next\_point[a]\)\(b\) 的任意一个子树中选择一个子树去走.
我们先看 \(a,b\) 都顶到头的时候,也就是他们只能走一个子树的时候。
这是,我们求出这时的答案 \(now1\)
假设最后一步是 \(a\) 走的。
那么我们让 \(a\) 退回去,那么假设 \(a\) 要在这个地方进子树,就可以统计答案。
\(b\) 也同理。
但是我调了一个晚上没有调出来。。。
代码:

#include <bits/stdc++.h>
#define N 500005
using namespace std;template <typename T>
inline void read(T &num)
{T x = 0, f = 1;char ch = getchar();for (; ch > '9' || ch < '0'; ch = getchar())if (ch == '-')f = -1;for (; ch <= '9' && ch >= '0'; ch = getchar())x = (x << 3) + (x << 1) + (ch ^ '0');num = x * f;
}int n, A, B;
vector<pair<int, int>> E[N];
int chain[N], clen[N], cnt, maxd[N];
int lg2[N], st1[21][N], st2[21][N];bool dfs(int x, int dest, int fa)
{if (x == dest){chain[++cnt] = x;clen[cnt] = 0;return true;}for (auto [y, w] : E[x])if (y != fa){if (dfs(y, dest, x)){chain[++cnt] = x;clen[cnt] = w;return true;}}return false;
}int getd(int x, int fa)
{int mx = 0;for (auto [y, w] : E[x])if (y != fa){mx = max(mx, w + getd(y, x));}return mx;
}inline int qry1(int l, int r)
{int k = lg2[r - l + 1];return max(st1[k][l], st1[k][r - (1 << k) + 1]);
}inline int qry2(int l, int r)
{int k = lg2[r - l + 1];return max(st2[k][l], st2[k][r - (1 << k) + 1]);
}int main()
{read(n);read(A);read(B);for (int i = 1, u, v, w; i < n; i++){read(u);read(v);read(w);E[u].push_back({v, w});E[v].push_back({u, w});}dfs(B, A, 0);chain[0] = chain[cnt + 1] = 0;for (int i = 2; i <= cnt; i++)clen[i] += clen[i - 1];for (int i = 1; i <= cnt; i++){int x = chain[i];for (auto [y, w] : E[x]){if (y != chain[i - 1] && y != chain[i + 1])maxd[i] = max(maxd[i], w + getd(y, x));}st1[0][i] = maxd[i] + clen[i];st2[0][i] = maxd[i] - clen[i];}lg2[1] = 0;for (int i = 2; i <= cnt; i++)lg2[i] = lg2[i >> 1] + 1;for (int l = 1; (1 << l) <= cnt; l++){for (int i = 1; i + (1 << l) - 1 <= cnt; i++){st1[l][i] = max(st1[l - 1][i], st1[l - 1][i + (1 << (l - 1))]);st2[l][i] = max(st2[l - 1][i], st2[l - 1][i + (1 << (l - 1))]);}}int ans = 0;if (cnt & 1)ans = st2[0][((cnt + 1) >> 1) + 1] + clen[cnt] - st1[0][(cnt + 1) >> 1];elseans = st1[0][(cnt + 1) >> 1] - (st2[0][((cnt + 1) >> 1) + 1] + clen[cnt]);for (int i = cnt - 3; i >= 0; i--){int l = 1 + ((i + 1) >> 1), r = cnt - (i >> 1);if (i & 1)ans = max(st2[0][r] + clen[cnt] - qry1(l, r - 1), -ans);elseans = max(st1[0][l] - (qry2(l + 1, r) + clen[cnt]), -ans);}printf("%d\n", ans);return 0;
}

T4

猜了个 \(30pts\) 的结论,实则 \(10pts\)
有点懵。贴一个老师的题解:
image

这是代码:

#include <bits/stdc++.h>
#define N 1000005
#define M 105
using namespace std;
typedef long long ll;
typedef __int128 i128;template <typename T>
void write(T num)
{if (num < 0)putchar('-'), num = -num;if (num >= 10)write(num / 10);putchar(num % 10 + '0');
}int pr[N], np[N], ptot;
void init()
{int n = 1000000;for (int i = 2; i <= n; i++){if (!np[i])pr[++ptot] = i;for (int j = 1; j <= ptot && i * pr[j] <= n; j++){np[i * pr[j]] = 1;if (i % pr[j] == 0)break;}}
}ll pfac[M];
int vis[M], match[M], rev[M];bool dfs(int x, int m)
{for (int j = 1; j <= m; j++)if (!vis[j] && x % pfac[j] != 0){vis[j] = 1;if (!match[j] || dfs(match[j], m)){match[j] = x;rev[x] = j;return true;}}return false;
}void solve()
{int n, m;ll k;scanf("%d %lld", &n, &k);if (n == 2){printf("%lld %lld\n", 2 * k, k);return;}ll tmp = k;m = 0;for (int i = 1; i <= ptot && 1ll * pr[i] * pr[i] <= tmp; i++){if (tmp % pr[i] == 0){pfac[++m] = pr[i];while (tmp % pr[i] == 0)tmp /= pr[i];}}if (tmp)pfac[++m] = tmp;if (m < n){puts("-1");return;}for (int i = 1; i <= n; i++)rev[i] = 0;for (int j = 1; j <= m; j++)match[j] = 0;for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++)vis[j] = 0;if (!dfs(i, m)){puts("-1");return;}}for (int i = 1; i <= n; i++){write((i128)i * k / pfac[rev[i]]);putchar(' ');}putchar('\n');
}int main()
{init();int ttt;scanf("%d", &ttt);while (ttt--)solve();return 0;
}

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

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

相关文章

wordpress 仅显示标题seo会被取代吗

在当今快节奏的软件开发领域&#xff0c;提升开发效率是每个开发者都追求的目标。对于 Vue 前端开发而言&#xff0c;Visual Studio Code&#xff08;VSCode&#xff09;已经成为了众多开发者的首选编辑器。而随着人工智能技术的发展&#xff0c;各类 AI 编码扩展工具如雨后春笋…

2025多校冲刺CSP模拟赛1(螳臂复活祭)

写在前面:题解未动,废话先行: 这次的模拟赛,肝硬化竟取得了比它近三次校内模拟赛的总分之和还要高 \(5pts\) 的成绩!(虽然 \(rank~50\) ),兴奋异常(其实没有),遂写博文(其实是前几天没空写)。顺带一提,那…

龙岩做网站的公司网站开发资源网

1. 题目 给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict&#xff0c;在字符串中增加空格来构建一个句子&#xff0c;使得句子中所有的单词都在词典中。返回所有这些可能的句子。 说明&#xff1a; 分隔时可以重复使用字典中的单词。 你可以假设字典中没有重复的…

最新创建的网站网站建设及推广

一、MybatisPlus简介 MybatisPlus&#xff08;简称MP&#xff09;是一个流行的Java持久层框架&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生&#xff0c;旨在简化数据库操作和提高开发效率。MybatisPlus为开发者提供了一套方便的API和…

tar: Ignoring unknown extended header keyword LIBARCHIVE.xattr.com.apple.provenance

tar: Ignoring unknown extended header keyword LIBARCHIVE.xattr.com.apple.provenance这个警告信息是由于不同操作系统之间归档工具的兼容性问题导致的。 错误信息解释 关键词含义LIBARCHIVE.xattr.com.apple.prove…

短剧小程序核心专业的技术拆解:视频加载优化、用户留存与商业化落地​

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

上小学网站建设php网站开发技术背景

更新spring-boot jar包中的BOOT-INF/lib目录下的jar包 场景 需要更新lib目录下某个jar包的配置文件 失败的解决方法 用解压软件依次打开spring-boot jar包&#xff08;设为a.jar&#xff09;、BOOT-INF/lib目录下的jar包&#xff08;设为b.jar&#xff09;&#xff0c;然后修改…

电影网站推荐哪个网站好沧州网站艰涩很

点击菜单栏 File --> Project Structure 在弹出的窗口中点击选择左侧的 Facets&#xff0c;接着点击右边的 &#xff0c;弹出的菜单中选择 web 在弹出的 『Choose Module』窗口中选择要转为 web 的项目&#xff08;模块&#xff09;&#xff0c;然后点击 OK 选择好模块后…

做网站最好选什么语言南昌做企业网站

本篇内容包括&#xff1a;ArrayList 概述、ArrayList 的扩容机制&#xff08;包含源码部分&#xff09;、如何在遍历 ArrayList 时正确的移除一个元素、ArrayList 的构造方法及常用方法、关于 Array 与 ArrayList 的区别、关于 CopyOnWriteArrayList、关于 Fail Fast 与 Fail S…

完整教程:Apache Doris 入门与技术替代方案

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

网站数据库怎么做同步推广网站设计推广方案

过去从未仔细了解过使用 top 和 htop 等命令时显式的CPU信息&#xff0c;本文我们详解解读和标注一下各个数据项的含义&#xff0c;同时和 Ganglia 显式的数据做一个映射。开始前介绍一个小知识&#xff0c;很多查看CPU的命令行工具都是 cat /proc/stat 里的数据&#xff0c;所…

微信网站建设塞尼铁克it彩票网站建设维护工程师

摘要&#xff1a;AJAX是一个在前端的应用非常广泛技术&#xff0c;为什么还要谈它呢&#xff1f;么得办法之前学的不全面&#xff0c;再收拾收拾。水平有限&#xff0c;欢迎指正&#xff01; AJAX&#xff08;全称&#xff1a;Asynchronous JavaScript and XML&#xff09;是一…

wordpress主题发布站源码wordpress文章显示作者

需求分析&#xff1a;使用Allegro软件进行PCB Layout设计时&#xff0c;当电路图中有很多路相同的模块&#xff0c;使用模块复用的的操作方法&#xff0c;可以显著提高工作效率&#xff0c;同时也可以使PCB布局在整体上显得美观。下面来讲述这个方法。 具体方法及说明&#xf…

福州市 2025 国庆集训 Day2 前三题题解

福州市 2025 国庆集训 Day2 前三题题解 T1 U614648 strip 首先不难想到,将最长的两个放在两端,并且最长的将非插头那端突出去是最合算的。 然后我们来看看中间的 \(s-2\) 个位置与 \(n-2\) 个插座的分配。 需要遵循的…

2025 年马赛克厂家 TOP 企业品牌推荐排行榜,陶瓷,游泳池,喷墨,冰裂,拼花,防滑,复古,家装马赛克推荐这十家公司!

引言在当前建筑陶瓷行业中,马赛克产品的应用场景愈发广泛,从标准游泳池、水上乐园到别墅、酒店会所等,对马赛克的需求持续增长。然而,行业内也面临着诸多问题,部分厂家缺乏专业的研发能力,产品质量参差不齐,有的…

oppoR9m刷Linux系统: 手动备份系统与基带IMEI/NVRAM/QCN

前言全局说明某些原因,软件不能正确读取手机分区信息,那么就要手动创建脚本来备份注意:刷机,会丢失用户:照片、聊天等信息资料。请备份基带等信息。请慎重刷机 !!! 注意:刷机,会丢失用户:照片、聊天等信息资料…

原来你是这样的claude code aciton:没想象中好

需要占用 github action minutes,要用钱哦 并不是在客户端艾特,而是在 gh网页上 at github自动生成的 pull request workflow 文件不对,版本需要更新

2025/9/29

2025/9/291.统一建模语言训练 2.数据结构学习 3.学习Java开发思路

实用指南:【Python】正则表达式

实用指南:【Python】正则表达式pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&qu…

专门做调查的网站建设春秋龙卡信用卡网站

MYSQL避免全表扫描 1.对查询进行优化&#xff0c;应尽量避免全表扫描&#xff0c;首先应考虑在 where 及 order by 涉及的列上建立索引 2.应尽量避免在 where 子句中对字段进行 null 值判断&#xff0c;否则将导致引擎放弃使用索引而进行全表扫描 如&#xff1a;select id f…