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

【题解】Codeforces Round 1045 (Div. 2) Problem.B ~ Problem.E

B. Add 0 or K

问题描述

给定一个数组 aaa 和一个整数 kkk,对于每个元素 aia_iai,可以增加 ci×kc_i \times kci×k(其中 cic_ici 是整数,且 0≤ci≤k0 \leq c_i \leq k0cik)。目标是使整个数组的最大公因数(GCD)大于 1。

方法:使所有元素成为 k+1k+1k+1 的倍数

一个有效的策略是让每个元素 aia_iai 操作后成为 k+1k+1k+1 的倍数(因为 k+1≥2k+1 \geq 2k+12,如果所有元素都是 k+1k+1k+1 的倍数,则 GCD 至少为 k+1>1k+1 > 1k+1>1)。

关键观察

  • 由于 k≡−1(modk+1)k \equiv -1 \pmod{k+1}k1(modk+1)(因为 k+1≡0(modk+1)k + 1 \equiv 0 \pmod{k+1}k+10(modk+1),所以 k≡−1k \equiv -1k1),增加 kkk 会改变 aia_iaik+1k+1k+1 取模的结果。
  • 具体地,每增加一次 kkkaia_iaik+1k+1k+1 取模的余数减少 1:
    (ai+k)mod(k+1)=(aimod(k+1)−1)mod(k+1)(a_i + k) \mod (k+1) = (a_i \mod (k+1) - 1) \mod (k+1) (ai+k)mod(k+1)=(aimod(k+1)1)mod(k+1)

类似地,可以选择 d=k−1d = k-1d=k1(假设 k>1k > 1k>1)但是需要特判

Code

#include<bits/stdc++.h>
#define int long longusing namespace std;void solve()
{int n,k;cin >> n >> k;vector<int> a(n+1);for(int i = 1; i <= n; i ++){cin >> a[i];}if(k == 1){for(int i = 1; i <= n; i ++){if(a[i] % 2 == 1) a[i] += k;}}else if(k == 2){for(int i = 1; i <= n; i ++){if(a[i] % 3 == 1){a[i] += 2;}else if(a[i] % 3 == 2){a[i] += 4;}}}else{for(int i = 1; i <= n; i ++){int t = a[i] % (k-1);a[i] += ((k-1)-t) * k;}}		for(int i = 1; i <= n; i ++){cout << a[i] << ' ';}cout << '\n';
}signed main()
{ios::sync_with_stdio(false);cin.tie(0);int t = 1;cin >> t;while(t --){solve();}
}

C. Even Larger

1.问题转化

如果每一个偶数和左右两边奇数构成的子段满足要求,则任意子段都满足。因为所有子段都可以通过删减满足要求的子段变为长度为3的子段。

2.贪心

对于 i = 2的元素,使得它右边的元素变小,一定优于使它左边元素变小。因为 i = 4 可以使用后者,而 2 的前面已经不存在偶数了。

Code

#include<bits/stdc++.h>
#define int long longusing namespace std;void solve()
{int n;cin >> n;vector<int> a(n+1);for(int i = 1; i <= n; i ++){cin >> a[i];}int ans = 0;for(int i = 2; i <= n; i += 2){int t = a[i-1];if(i + 1 <= n) t += a[i+1];ans += max(t-a[i],0ll);if(i + 1 <= n) {a[i+1] -= max(t-a[i],0ll);a[i+1] = max(a[i+1],0ll);}}cout << ans << '\n';}signed main()
{ios::sync_with_stdio(false);cin.tie(0);int t = 1;cin >> t;while(t --){solve();}
}

D. Sliding Tree

1.问题转化

要使得树变为链,最优情况是以树的直径(什么是树的直径?)为基础展开。如果能使得一颗树的直径长度为n - 1,这颗树就是一条链。

2.操作方法

每一步操作至多使得树的直径增加1。答案有下界 n−1−L直径n - 1 - L_{直径}n1L直径。每一步选择直径上的一个度数大于2的点,或者说"产生分叉的点”,将直径移动到其分支上,可以使得直径增加1。
而直径没变成链之前,永远存在”产生分叉的点“。

3.求解第一个操作位置

首先把直径找出来,然后遍历直径找分叉点即可。
(如何找到直径?)

Code

#include<bits/stdc++.h>
#define int long longusing namespace std;void solve(){int n;cin >> n;vector<vector<int>> v(n+1);for(int i = 1; i <= n - 1; i ++){int x,y;cin >> x >> y;v[x].push_back(y),v[y].push_back(x);}if(n <= 2){cout << -1 << '\n';return;}vector<int> dist1(n+1,1e18);auto dfs1 = [&](auto &&self,int u,int p,int depth)->void{dist1[u] = depth + 1;for(int i : v[u]){if(i != p){self(self,i,u,dist1[u]);}}};dfs1(dfs1,1,-1,0);int p = max_element(dist1.begin()+1,dist1.end()) - dist1.begin();vector<int> dist2(n+1,-1),ne(n+1,1e18);auto dfs2 = [&](auto &&self,int u,int p) -> int{bool flag = false;for(int i : v[u]){if(i != p){flag = 1;int ret = self(self,i,u); if(ret + 1 > dist2[u]){ne[u] = i;dist2[u] = ret + 1;}}}if(!flag) {ne[u] = -1;dist2[u] = 1;}return dist2[u];};dfs2(dfs2,p,-1);int u = ne[p],last = p;while(u != -1){if(v[u].size() >= 3){for(int i : v[u]){if(i != ne[u] && i != last){cout << last << ' ' << u << ' ' << i << '\n';return;}}}last = u;u = ne[u];}cout << -1 << '\n';
}signed main(){ios::sync_with_stdio(false);cin.tie(0);int t = 1;cin >> t;while(t --){solve();}
}

E. Power Boxes

1.突破口

考虑n - 1和n 两个位置,能否用3次询问确定这两个位置的能量值?答案是肯定的,先throw第n-1个位置,如果弹1次,n-1位置是2,否则是1。通过交换n-1和n这两个位置,可以求出n。

2.推进

得到了 n - 1 和 n 的能量值,如何求n - 3 和n - 2呢?
定义 dist[i]dist[i]dist[i] 为球被扔到 iii 处后,继续弹跳的次数。

  • 如果 dist[n]==dist[n−1]dist[n] == dist[n-1]dist[n]==dist[n1],可以按照上文方法的throw第n-3个位置再交换,在3次内求得。
  • 如果 dist[n]!=dist[n−1]dist[n] != dist[n-1]dist[n]!=dist[n1] 则一定有 dist[n]−1==dist[n−1]dist[n] - 1== dist[n-1]dist[n]1==dist[n1],这是由于能量值的取值只能是1和2. 这种情况改成throw第n - 2个位置即可。

3.小情况(n为奇数)

n为奇数需要特殊处理n == 1的情况,方法有很多,代码中提供了一种。

Code

#include<bits/stdc++.h>
#define int long longusing namespace std;void solve(){int n;cin >> n;vector<int> a(n+6),dist(n+6);auto thr = [&](int x){cout << "throw " << x << endl;int ret;cin >> ret;return ret;};vector<int> history;auto swa = [&](int x){swap(a[x],a[x+1]);cout << "swap " << x << endl;history.push_back(x);};int tmp = thr(n-1);if(tmp == 1) a[n-1] = 2;else a[n-1] = 1;swa(n-1);tmp = thr(n-1);if(tmp == 1) a[n-1] = 2;else a[n-1] = 1;for(int i = n - 3; i >= 1; i -= 2){if(a[i+3] == 2) dist[i+3] = dist[i+3+2] + 1;else dist[i+3] = dist[i+3+1] + 1;if(a[i+2] == 2) dist[i+2] = dist[i+2+2] + 1;else dist[i+2] = dist[i+2+1] + 1;if(dist[i+2] == dist[i+3]){int tmp = thr(i);if(tmp == dist[i+2]+1){a[i] = 2;}else{a[i] = 1;}swa(i);tmp = thr(i);if(tmp == dist[i+2]+1){a[i] = 2;}else{a[i] = 1;}}else{int tmp = thr(i+1);if(tmp == dist[i+2] + 1){a[i+1] = 1;}else{a[i+1] = 2;}swa(i);tmp = thr(i+1);if(tmp == dist[i+2]+1){a[i+1] = 1;}else{a[i+1] = 2;}}}if(n & 1){if(a[3] == 2) dist[3] = dist[5] + 1;else dist[3] = dist[4] + 1;if(a[2] == 2) dist[2] = dist[4] + 1;else dist[2] = dist[3] + 1;if(dist[2] != dist[3]){int tmp = thr(1);if(tmp == dist[2] + 1) a[1] = 1;else a[1] = 2;}else{swa(1);int tmp = thr(2);if(tmp == dist[3] + 1) a[2] = 1;else a[2] = 2;}}while(history.size()){swap(a[history.back()],a[history.back()+1]);history.pop_back();}cout << "! ";for(int i = 1; i <= n; i ++){cout << a[i] << ' ';}cout << endl;
}signed main(){ios::sync_with_stdio(false);cin.tie(0);int t = 1;cin >> t;while(t --){solve();}
}
http://www.dtcms.com/a/353677.html

相关文章:

  • KANO 模型:功能不是“加一分”,而是“分五类”
  • YOLO-yaml/pt模型文件的差异
  • GitFlow工作流
  • 铠德科技为您详解静电与温冲背后的隐形损失
  • 下一代防火墙
  • nestjs 导出excel
  • JoyAgent-JDGenie开源多智能体系统详解:架构、部署与企业级应用案例
  • day22 回溯算法part01
  • Day6--HOT100--238. 除自身以外数组的乘积,41. 缺失的第一个正数,73. 矩阵置零
  • 前端漏洞(下)- ClickJacking漏洞
  • 指针 (六):sizeof和strlen细节强化之“做题篇”
  • stl--std::map
  • Java 使用Jna 调用 C# dll文件踩到的坑
  • SpringBoot整合Redis:从入门到实战的完整指南
  • 【Linux 小实战】自定义 Shell 的编写
  • LCD 上显示字符
  • zookeeper-集群扩缩容
  • 稳敏双态融合架构--架构师的练就
  • banner这个文件是怎么请求到后端数据的
  • Rust:引用
  • Vue-24-利用Vue3的element-plus库实现树形结构数据展示
  • Autodesk Maya 2026.2 全新功能详解:MotionMaker AI 动画、LookdevX 材质增强、USD 工作流优化
  • 在MiniOB源码中学习使用Flex与Bison解析SQL语句-第二节
  • 【Linux】正则表达式学习记录
  • FFMPEG api使用
  • 从disable_cost到disabled_nodes,最小代价预估质的飞跃
  • nestjs日志(nest-winston)
  • pyecharts可视化图表-tree:从入门到精通
  • Linux 系统调优与CPU-IO-网络内核参数调优
  • Task04: CAMEL框架中的多智能体系统(课程第三章剩余章节)