当前位置: 首页 > news >正文

AT AGC003 题解

A

简单题,由于每一步的距离都可以随意确定,同时只要求最后回到原点,所以只要各个方向上都有相应相反的方向存在即为合法,反之存在一个不匹配的方向则不合法。我的写法绝对傻了。

#include <bits/stdc++.h>using i64 = long long;void solve() {std::string s;std::cin >> s;int tn = 0, ts = 0, te = 0, tw = 0;for (auto i : s) {if (i == 'N')tn++;if (i == 'S')ts++;if (i == 'E')te++;if (i == 'W')tw++;}if (tn) {if (ts) {}else {std::cout << "No\n";return;}}if (ts) {if (tn) {}else {std::cout << "No\n";return;}}if (tw) {if (te) {}else {std::cout << "No\n";return;}}if (te) {if (tw) {}else {std::cout << "No\n";return;}}std::cout << "Yes\n";
}int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);solve();return 0;
}

B

简单贪心题,容易发现,每个选项要么和自己匹配,要么和相邻匹配,我们钦定每个位置和自己或者后一个位置匹配,显然和自己合并与和下一个数合并的次序和安排不影响答案,我们优先匹配自身,则 \(\bmod 2\) 之后只有 \(0/1\),如果 \(a_i = a_{i + 1} = 1\) 则都减去 \(1\) 之后累进答案。

#include <bits/stdc++.h>using i64 = long long;void solve() {int n;std::cin >> n;std::vector<int> a(n + 1);for (int i = 1; i <= n; i++) {std::cin >> a[i];}i64 ans;for (int i = 1; i <= n; i++) {ans += a[i] / 2;a[i] = a[i] % 2;if (i != n && a[i] && a[i + 1]) {a[i]--;a[i + 1]--;ans++;}}std::cout << ans << "\n";
}int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);solve();return 0;
}

C

注意审题。交换的是“相邻”的,同时“反转”顺序。容易发现操作一本质交换 \(a_i, a_{i + 1}\),操作二本质交换 \(a_i, a_{i + 2}\),下标奇偶发生了变化。最小化操作一就尽可能,直到不得不用操作二。那么我们排序,找到新的位置和原来位置,如果下标奇偶性不一样那么就要用一次操作一调整坐标,答案最后记得除以 \(2\)

#include <bits/stdc++.h>using i64 = long long;void solve() {int n;std::cin >> n;std::vector<int> a(n + 1), b(n + 1);for (int i = 1; i <= n; i++) {std::cin >> a[i];b[i] = a[i];}std::sort(b.begin() + 1, b.end());for (int i = 1; i <= n; i++) {a[i] = std::distance(b.begin(), std::lower_bound(b.begin() + 1, b.end(), a[i]));}i64 ans = 0;for (int i = 1; i <= n; i++) {if ((a[i] & 1) != (i & 1))ans++;}std::cout << (ans / 2) << "\n";
}int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);solve();return 0;
}

D

数论大分讨,但是很妙啊。

不难发现,对于一个立方数而言,每一种质因子的个数一定是 \(3\) 的倍数;同时普遍地,对于一个数 \(x\),最多只有一个 \(\gt \sqrt{x}\) 的质因子。设 \(s_i\) 上界为 \(L\),一个朴素的想法是去拆每一个 \(s_i\),检查是否有一个大于 \(\sqrt{L}\) 的质因子,如果有则无法和其他数相乘得到 cubic number,复杂度来到 \(O(n \sqrt{L})\),考虑怎么扩展这个做法:对于一个数 \(x\),最多只有两个大于 \(\sqrt[3]{x}\) 的质因子。

首先,我们将 \([1, \sqrt[3]{L}]\)\(s_i\) 每个立方根因子排除掉,保证质因子个数控制在两个以内,找到每一个 \(s_i\) 每一个立方根因子剩下的具体个数。

对于数 \(x\) 进行分类讨论,将其每个质因子个数对 \(3\) 取模,产生冲突的数会是两两对应的(对 \(3\) 取差)。

  • 有一个 \(\gt \sqrt{n}\) 的质因子,则不会和其他数产生冲突,直接累计进答案算贡献
  • 有一个/两个大小在 \([\sqrt[3]{n}, \sqrt{n}]\) 之间的质因子,此时当且仅当两个质因子大小相同、个数分别为 \(1, 2\) 时才有可能会产生冲突。假设 \(x\) 含有的两个在此范围内的质因子大小不同,则无法和其他数产生冲突,直接计入贡献;如果只有一个或者两个大小相同的质因子,才有可能产生冲突,我们对在此范围内的质因子开 std::pairstd::map 用于查询
  • 不存在 \(\sqrt[3]{n}\) 以上质因子的 \(s_i\),只会冲突,我们还是开 std::map,对于当前的 \(s_i\),取模之后找到冲突的 \(x'\),将 \(s_i\) 所在项 \(+ 1\)\(x'\) 所在项取 \(\max\) 即为键值对答案的贡献

复杂度降到了 \(n\sqrt[3]{n}\) 级别,加上一个 \(n \log n\) 的预处理。

#include <bits/stdc++.h>#define int long longconstexpr int N = 1e5 + 7;
constexpr int SL1 = 1e5;
constexpr int SL2 = 2154;int n, mxs, ans;
int pct1, pct2;
int s[N], pri[N], g[N];
bool isp[N];std::map<int, int> t0;
std::map<std::pair<int, int>, int> t1, t2;void init() {for (int i = 2; i <= SL1; i++) {if (!isp[i])pri[++pct1] = i;if (i == SL2)pct2 = pct1;for (int j = 1; j <= pct1 && i * pri[j] <= SL1; j++) {isp[i * pri[j]] = 1;if (i % pri[j] == 0)break;}}
}void solve(int x) {memset(g, 0, sizeof(g));int sum1 = 1, sum2 = 1;for (int i = 1; i <= pct2; i++) {while (x % pri[i] == 0) {x /= pri[i];g[i]++;}g[i] %= 3;if (g[i] == 1) {sum1 *= pri[i];sum2 *= pri[i] * pri[i];} else if (g[i] == 2) {sum1 *= pri[i] * pri[i];sum2 *= pri[i];}}int p = std::sqrt(x);if (SL2 < x && x <= SL1 && !isp[x]) {int c1 = ++t1[{x, sum1}], c2 = t2[{x, sum2}];if (c1 > c2)ans++;} else if (x > SL1 && p * p == x && !isp[p]) {int c1 = ++t2[{p, sum1}], c2 = t1[{p, sum2}];if (c1 > c2)ans++;} else if (x == 1) {if (sum1 == 1 && sum2 == 1) {if (!t0[sum2])ans++;t0[sum2] = 1;return;}int c1 = ++t0[sum1], c2 = t0[sum2];if (c1 > c2)ans++;} else {ans++;}
}signed main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);init();std::cin >> n;for (int i = 1; i <= n; i++) {std::cin >> s[i];}for (int i = 1; i <= n; i++) {solve(s[i]);}std::cout << ans << "\n";return 0;
}

E

http://www.jsqmd.com/news/43040/

相关文章:

  • Oracle故障处理:aix 5.3 ml6安装10.2.0.1 rac报错
  • Hive SQL循环与MapReduce的关系
  • 《算 设》学
  • [GESP202506 二级] 幂和数
  • hive mybatis是否支持动态SQL
  • 一类将度数变为 1/2 的优化建图 笔记
  • 2025.11.17模拟赛
  • 11/17
  • 英语_阅读_Electric cars_待读
  • linux 下中文字体安装.ttf 格式
  • 2025 年锚具厂家 TOP 企业品牌推荐排行榜,预应力锚具 / 五孔锚具 / 低回缩锚具 / 张拉锚具 / 固定端锚具 / 桥梁预应力锚具 / 边坡锚具公司推荐!
  • 2025 年锚具厂家 TOP 企业品牌推荐排行榜,桥梁伸缩缝 / 道路伸缩缝 / 梳齿板伸缩缝推荐这十家公司!
  • 2025 年锚具厂家 TOP 企业品牌推荐排行榜,橡胶支座 / 桥梁支座 / 国标支座 / 滑板支座 / 固定支座 / 弹性支座 / 活动铰支座 / 盆式支座 / 减震支座 / 缓冲支座公司推荐!
  • 软件工程学习日志2025.11.17
  • CSP2025 游记 + whk 期中
  • 论文速读 | 2025年11月
  • 2025-11-17
  • 九成九新自用C#入门文档
  • 商场展览车生产厂家十大排名及选购推荐,航利通达网红礼盒拖车公司,透明车厢生产厂家,车载展柜公司十大权威排行,商场展览车公司十大排名
  • Flask+Celery+Blueprint
  • 102302109-胡贝贝-作业3
  • hadoop linux 安装
  • 2025最新展柜设计公司推荐,展柜制作公司,展台源头厂家,烤漆展柜十大品牌推荐榜,家纺柜台供应厂家十大排行榜:梵之宇装饰推荐
  • 团队技术资产建设:从散兵游勇到标准化作战
  • 2025年11月学习机榜单:打破智商税偏见,十大提分机型实证推荐
  • 解决罗技M590右键必须用力才能使用的问题
  • 悼念故友
  • 题解:uoj632【UR #21】挑战最大团
  • [CSP-S 2025] 员工招聘 / employ
  • 20232410 2025-2026-1 《网络与系统攻防技术》实验六实验报告