Contests 链接:Codeforces Round #470 (Div. 1)
过题数:3
排名:315/1183

A. Primal Sport

题意

AliceAliceAlice 和 BobBobBob 两人在玩一个游戏,AliceAliceAlice 先开始,两人轮流进行,第 iii 次游戏中,对于一个整数 Xi" role="presentation" style="position: relative;">XiXiX_i,选择一个素数 p<Xip<Xip,然后找到一个最小的整数 YYY,使得 Y≥X" role="presentation" style="position: relative;">Y≥XY≥XY\geq X 且 YYY 能被 p" role="presentation" style="position: relative;">ppp 整除,将这个数字作为下一次游戏的新值 Xi+1Xi+1X_{i+1} 继续进行游戏,现在游戏已经进行了两次,得到了 X2X2X_2 的值,问最小的可能的 X0 (X0≥3)X0(X0≥3)X_0~(X_0\geq3) 的值为多少。

输入

输入为一个整数 X2 (4≤X2≤106)X2(4≤X2≤106)X_2~(4\leq X_2\leq10^6),数据保证 X2X2X_2 是合数。

输出

输出最小的可能的 X0X0X_0 的值。

样例

输入
14
输出
6
提示
设 X0=6X0=6X_0=6,则其中一种合法的游戏过程如下:
1. AliceAliceAlice 选择 p=5p=5p=5,X1X1X_1 的值为 101010;
2. BobBobBob 选择 p=7p=7p=7,X2X2X_2 的值为 141414。
输入
20
输出
15
提示
设 X0=15X0=15X_0=15,则其中一种合法的游戏过程如下:
1. AliceAliceAlice 选择 p=2p=2p=2,X1X1X_1 的值为 161616;
2. BobBobBob 选择 p=5p=5p=5,X2X2X_2 的值为 202020。
输入
8192
输出
8191

题解

我们可以根据 XiXiX_i 的值确定 Xi−1Xi−1X_{i-1} 的合法的取值区间:[Xi−p+1,Xi][Xi−p+1,Xi][X_i-p+1,X_i],其中 ppp 为 Xi" role="presentation" style="position: relative;">XiXiX_i 的最大的质因子,对于 Xi−1≥Xi−p+1Xi−1≥Xi−p+1X_{i-1}\geq X_i-p+1 的值,只要选择质数 ppp 就可以通过 Xi−1" role="presentation" style="position: relative;">Xi−1Xi−1X_{i-1} 得到 XiXiX_i 的值,对于 Xi−1<Xi−p+1Xi−1<Xi−p+1X_{i-1} 的值,如果选择质数 ppp,则只能得到 Xi−p" role="presentation" style="position: relative;">Xi−pXi−pX_i-p 的值,如果选择其他质数,由于 ppp 是最大的质因数,选择其他质数能够改变的增量一定小于 p" role="presentation" style="position: relative;">ppp,所以 X′i<XiXi′<XiX_i'。但是最小的 Xi−1Xi−1X_{i-1} 并不能得到最小的 Xi−2Xi−2X_{i-2},因此对于 X2X2X_2 我们需要枚举所有可能的 X1X1X_1 的值,来找到最小的 X0X0X_0 的值。

过题代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <cstring>
#include <string>
#include <vector>
#include <list>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <bitset>
#include <algorithm>
#include <functional>
#include <iomanip>
using namespace std;#define LL long long
const int maxn = 1000000 + 100;
int cnt, n;
bool vis[maxn];
int prime[maxn];void Prime() {for(int i = 2; i < maxn; ++i) {if(!vis[i]) {prime[cnt++] = i;}for(int j = 0; j < cnt && i < maxn / prime[j]; ++j) {int k = i * prime[j];vis[k] = true;if(i % prime[j] == 0) {break;}}}
}int Find(int x) {int ret;int xx = x;for(int i = 0; i < cnt && prime[i] <= xx / prime[i]; ++i) {while(x % prime[i] == 0) {x /= prime[i];ret = prime[i];}}if(x != 1) {ret = x;}return ret;
}int main() {#ifdef LOCALfreopen("test.txt", "r", stdin);
//    freopen("out.txt", "w", stdout);#endif // LOCALios::sync_with_stdio(false);Prime();while(scanf("%d", &n) != EOF) {int Start = Find(n);int ans = INT_MAX;for(int i = n - Start + 1; i <= n; ++i) {int tmp = i - Find(i) + 1;if(tmp >= 3) {ans = min(ans, tmp);}}printf("%d\n", ans);}return 0;
}

B. Producing Snow

题意

BobBobBob 从第 111 天到第 n" role="presentation" style="position: relative;">nnn 天每天堆体积为 ViViV_i 体积的雪人,第 iii 天的时候每一个已经堆好的雪人会融化 Ti" role="presentation" style="position: relative;">TiTiT_i 的体积,问在第 iii 天当天所有已经堆好的且没有完全融化的雪人会融化的总的体积。

输入

第一行包含一个整数 n (1≤n≤105)" role="presentation" style="position: relative;">n (1≤n≤105)n (1≤n≤105)n~(1\leq n\leq10^5),第 222 行包含 n" role="presentation" style="position: relative;">nnn 个整数 V1,V2,⋯,Vn (0≤Vi≤109)V1,V2,⋯,Vn(0≤Vi≤109)V_1,V_2,\cdots,V_n~(0\leq V_i\leq10^9),第 333 行包含 n" role="presentation" style="position: relative;">nnn 个整数 T1,T2,⋯,Tn (0≤Ti≤109)T1,T2,⋯,Tn(0≤Ti≤109)T_1,T_2,\cdots,T_n~(0\leq T_i\leq10^9)。

输出

输出 nnn 个整数,第 i" role="presentation" style="position: relative;">iii 个整数表示第 iii 天融化的雪人体积。

样例

输入
3
10 10 5
5 7 2
输出
5 12 4
提示
第一天堆了一个体积为 10" role="presentation" style="position: relative;">101010 的雪人,融化了 555 的体积,剩下一个体积为 5" role="presentation" style="position: relative;">555 的雪人,第二天堆了一个体积为 101010 的雪人,每个雪人都融化 777 的体积,第一天的 5" role="presentation" style="position: relative;">555 体积的雪人全都融化了,第二天的雪人融化了 777 体积,总共融化了 12" role="presentation" style="position: relative;">121212 体积,第二天只剩下一个体积为 333 的雪人,第三天堆了一个体积为 5" role="presentation" style="position: relative;">555 的雪人,第二天雪人剩下的体积和第三天雪人的体积都大于等于第三天融化的体积,第三天总共融化了 444 体积的雪人。
输入
5
30 25 20 15 10
9 10 12 4 13
输出
9 20 35 11 25

题解

假设第 1" role="presentation" style="position: relative;">111 天堆起来的雪人体积为无穷大,那么到第 iii 天的时候这个雪人融化的体积就为 ∑j=1iTj" role="presentation" style="position: relative;">∑ij=1Tj∑j=1iTj\sum_{j=1}^iT_j,第 iii 天刚堆起来的雪人没有受到前 i−1" role="presentation" style="position: relative;">i−1i−1i-1 天融化的影响,但是可以假设这个雪人是从第 111 天堆起来的,第 i" role="presentation" style="position: relative;">iii 天的时候融化了 ∑i−1j−1Ti∑j−1i−1Ti\sum_{j-1}^{i-1}T_i 的体积,导致它第 iii 天的体积为 Vi" role="presentation" style="position: relative;">ViViV_i,因此可以认为这个雪人在第 111 天堆起来的时候的体积为 Vi+∑j=1i−1Tj" role="presentation" style="position: relative;">Vi+∑i−1j=1TjVi+∑j=1i−1TjV_i+\sum_{j=1}^{i-1}T_j,我们将到第 iii 天的所有雪人的体积都转化为 Vi′=Vi+∑j=1i−1Tj" role="presentation" style="position: relative;">V′i=Vi+∑i−1j=1TjVi′=Vi+∑j=1i−1TjV_i'=V_i+\sum_{j=1}^{i-1}T_j 后放入 mapmapmap 中,到第 iii 天完全融化的雪人就是 Vk′≤∑j=1iTj" role="presentation" style="position: relative;">V′k≤∑ij=1TjVk′≤∑j=1iTjV_k'\leq\sum_{j=1}^iT_j 的雪人,将这些雪人在第 iii 天融化的体积(Vk′−∑j=1i−1Tj" role="presentation" style="position: relative;">V′k−∑i−1j=1TjVk′−∑j=1i−1TjV_k'-\sum_{j=1}^{i-1}T_j)计算出来,然后从 mapmapmap 中删去它们,再计算第 iii 天能融化体积 Ti" role="presentation" style="position: relative;">TiTiT_i 的雪人的个数 cntcntcnt(可以 O(1)O(1)O(1) 维护),于是第 iii 天融化的雪人体积就为 ∑(Vj′−∑k=1i−1Tk)+Ti×cnt" role="presentation" style="position: relative;">∑(V′j−∑i−1k=1Tk)+Ti×cnt∑(Vj′−∑k=1i−1Tk)+Ti×cnt\sum(V_j'-\sum_{k=1}^{i-1}T_k)+T_i\times cnt,其中 ∑i−1k=1Tk<V′j≤∑ik=1Tk∑k=1i−1Tk<Vj′≤∑k=1iTk\sum_{k=1}^{i-1}T_k。

过题代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <cstring>
#include <string>
#include <vector>
#include <list>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <bitset>
#include <algorithm>
#include <functional>
#include <iomanip>
using namespace std;#define LL long long
const int maxn = 100000 + 100;
int n, cnt;
LL mp_cnt;
map<LL, int> mp;
map<LL, int>::iterator it, itt;
LL v[maxn], t[maxn];
map<LL, int>::iterator del[maxn];int main() {#ifdef LOCALfreopen("test.txt", "r", stdin);
//    freopen("out.txt", "w", stdout);#endif // LOCALios::sync_with_stdio(false);while(scanf("%d", &n) != EOF) {mp_cnt = 0;for(int i = 1; i <= n; ++i) {scanf("%I64d", &v[i]);}for(int i = 1; i <= n; ++i) {scanf("%I64d", &t[i]);t[i] += t[i - 1];}mp.clear();LL ans;for(int i = 1; i <= n; ++i) {ans = 0;cnt = 0;v[i] += t[i - 1];++mp[v[i]];++mp_cnt;it = mp.upper_bound(t[i]);for(itt = mp.begin(); itt != it; ++itt) {ans += ((itt->first) - t[i - 1]) * (itt->second);del[cnt++] = itt;mp_cnt -= itt->second;}for(int j = 0; j < cnt; ++j) {mp.erase(del[j]);}ans += mp_cnt * (t[i] - t[i - 1]);if(i != 1) {printf(" ");}printf("%I64d", ans);}printf("\n");}return 0;
}

C. Perfect Security

题意

有两个长度为 nnn 的序列 a1,a2,⋯,an" role="presentation" style="position: relative;">a1,a2,⋯,ana1,a2,⋯,ana_1,a_2,\cdots,a_n 和 b1,b2,⋯,bnb1,b2,⋯,bnb_1,b_2,\cdots,b_n,对于每一个 aiaia_i,在 bbb 序列中找到一个数字与其异或,成为新序列的第 i" role="presentation" style="position: relative;">iii 个元素 cicic_i,然后从 bbb 序列中删去被选中的数字,求能够构成的新序列中字典序最小的序列。

输入

第一行包含一个整数 n (1≤N≤3×105)" role="presentation" style="position: relative;">n (1≤N≤3×105)n (1≤N≤3×105)n~(1\leq N\leq3\times10^5),第二行为 nnn 个整数 a1,a2,⋯,an (0≤ai&lt;230)" role="presentation" style="position: relative;">a1,a2,⋯,an (0≤ai<230)a1,a2,⋯,an (0≤ai<230)a_1,a_2,\cdots,a_n~(0\leq a_i,第三行为 nnn 个整数 b1,b2,⋯,bn (0≤bi&lt;230)" role="presentation" style="position: relative;">b1,b2,⋯,bn (0≤bi<230)b1,b2,⋯,bn (0≤bi<230)b_1,b_2,\cdots,b_n~(0\leq b_i。

输出

输出 nnn 个整数,第 i" role="presentation" style="position: relative;">iii 个整数表示所求新序列的第 iii 项。

样例

输入
3
8 4 13
17 2 7
输出
10 3 28
提示
8⨁2=10" role="presentation" style="position: relative;">8⨁2=108⨁2=108\bigoplus2=10,4⨁7=34⨁7=34\bigoplus7=3,13⨁17=2813⨁17=2813\bigoplus17=28。对于其他可能的答案:(25,6,10),(25,3,15),(10,21,10),(15,21,15),(15,6,28)(25,6,10),(25,3,15),(10,21,10),(15,21,15),(15,6,28)(25,6,10),(25,3,15),(10,21,10),(15,21,15),(15,6,28),都比 (10,3,28)(10,3,28)(10,3,28) 的字典序大。

输入
5
12 7 87 22 11
18 39 9 12 16
输出
0 14 69 6 44
输入
10
331415699 278745619 998190004 423175621 42983144 166555524 843586353 802130100 337889448 685310951
226011312 266003835 342809544 504667531 529814910 684873393 817026985 844010788 993949858 1031395667
输出
128965467 243912600 4281110 112029883 223689619 76924724 429589 119397893 613490433 362863284

题解

将所有 bbb 序列中的数字建一棵字典树,从 1" role="presentation" style="position: relative;">111 到 nnn 对于每一个 i" role="presentation" style="position: relative;">iii,都取一个 bbb 序列中与 ai" role="presentation" style="position: relative;">aiaia_i 异或值最小的,然后将这个数字在字典树中出现的次数 −1−1-1。

过题代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <cstring>
#include <string>
#include <vector>
#include <list>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <bitset>
#include <algorithm>
#include <functional>
#include <iomanip>
using namespace std;#define LL long long
const int maxm = 300000 + 100;
const int maxn = 300000 * 32 + 100;
const int Size = 2;
struct Trie {int root, cnt;int val[maxn], tree[maxn][Size];int creat() {++cnt;memset(tree[cnt], 0, sizeof(tree[cnt]));val[cnt] = 0;return cnt;}void Init() {cnt = 0;root = creat();}int id(int x, int dig) {return ((x >> (31 - dig)) & 1);}void add(int x) {int pos = root;for(int i = 0; i < 32; ++i) {int w = id(x, i);if(tree[pos][w] == 0) {tree[pos][w] = creat();}pos = tree[pos][w];++val[pos];}}int query(int x) {int ret = 0;int pos = root;for(int i = 0; i < 32; ++i) {int w = id(x, i);if(tree[pos][w] == 0 || val[tree[pos][w]] == 0) {w = !w;ret |= (1 << (31 - i));}pos = tree[pos][w];--val[pos];}return ret;}
};
Trie t;
int n, x;
int num[maxn];int main() {#ifdef LOCALfreopen("test.txt", "r", stdin);
//    freopen("out.txt", "w", stdout);#endif // LOCALios::sync_with_stdio(false);while(scanf("%d", &n) != EOF) {t.Init();for(int i = 0; i < n; ++i) {scanf("%d", &num[i]);}for(int i = 0; i < n; ++i) {scanf("%d", &x);t.add(x);}for(int i = 0; i < n; ++i) {if(i != 0) {printf(" ");}printf("%d", t.query(num[i]));}printf("\n");}return 0;
}

Codeforces Round #470 (Div. 1)相关推荐

  1. 【二分】Producing Snow @Codeforces Round #470 Div.2 C

    time limit per test: 1 second memory limit per test: 256 megabytes Alice likes snow a lot! Unfortuna ...

  2. Codeforces Round #470 Div. 1

    A:暴力枚举x2的因子,由此暴力枚举x1,显然此时减去其最大质因子并+1即为最小x0. #include<iostream> #include<cstdio> #include ...

  3. Codeforces Round #470 (Div. 2) A Protect Sheep (基础)输入输出的警示、边界处理

    Bob is a farmer. He has a large pasture with many sheep. Recently, he has lost some of them due to w ...

  4. Codeforces Round #506 (Div. 3)

    Codeforces Round #506 (Div. 3) 实习期间事不多,对div3 面向题解和数据编程了一波 A. Many Equal Substrings 题目链接 A题就是找后缀和前缀重合 ...

  5. Codeforces Round #563 (Div. 2)/CF1174

    Codeforces Round #563 (Div. 2)/CF1174 CF1174A Ehab Fails to Be Thanos 其实就是要\(\sum\limits_{i=1}^n a_i ...

  6. 构造 Codeforces Round #302 (Div. 2) B Sea and Islands

    题目传送门 1 /* 2 题意:在n^n的海洋里是否有k块陆地 3 构造算法:按奇偶性来判断,k小于等于所有点数的一半,交叉输出L/S 4 输出完k个L后,之后全部输出S:) 5 5 10 的例子可以 ...

  7. Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解(每日训练 Day.16 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解 比赛链接:h ...

  8. Codeforces Round #712 Div.2(A ~ F) 超高质量题解(每日训练 Day.15 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #712 Div.2(A ~ F) 题解 比赛链接:https:// ...

  9. Codeforces Round #701 (Div. 2) A ~ F ,6题全,超高质量良心题解【每日亿题】2021/2/13

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A - Add and Divide B - Replace and Keep Sorted C ...

最新文章

  1. 运用C#生成docx格式的报表
  2. 数据结构:O(nlogn)算法
  3. ubuntu安装cgroup-tools
  4. java中null是常量吗_C_NULL Julia中的常量
  5. CloudIDE插件在手,按时下班不愁
  6. (三)数据结构与算法-队列
  7. Confluence 6 企业环境或者网站托管的 Java 配置策略
  8. linux新建用户不显示,linux系统无法添加用户帐号的原因分析
  9. 闲来无事,画个佩奇可好?
  10. 19、SPI 和 SST25VF016B
  11. 基于RFID定位技术的智能仓储管理系统--RFID智能仓储--新导智能
  12. 零基础英语语法速成(一)
  13. 程序猿生存指南-33 寂寞撩人
  14. 牛客竞赛语法入门班选择结构习题C++版本参考代码及部分解析
  15. 图书馆大数据分析系统能帮助图书馆完成哪些事,意义有多大?
  16. 如何安全删除电脑上的个人信息和隐私资料
  17. python处理csv文件计算均值_读取CSV文件,计算平均值并打印所述平均值
  18. 2020年茶艺师(初级)考试及茶艺师(初级)实操考试视频
  19. Python 机器学习 | 超参数优化 黑盒(Black-Box)非凸优化技术实践
  20. AtCoder - ABC 167 - E(数学推理+组合数)

热门文章

  1. 山东省2022 年专升本 计算机大纲(计算思维)
  2. oh my zsh 安装 zsh-completions
  3. 分布式框架Doubbo(入门级)
  4. 用Calibre 转mobi 到 DOC (WORD) 的方法
  5. python2输出中文乱码各种办法都不行_Python中文全攻略 中文乱码 输出中文乱码
  6. web第八课:图片标签的路径和属性
  7. TestStand-单执行界面
  8. python开发mbus程序_apis-scraper-Python网络刮板获取波兰政党的支持率-TheLastGimbus PL EN...
  9. shape context-形状上下文
  10. vlisp操作CAD绘图人机交互的一个小技巧