ABC250 C~E

  • [C - Adjacent Swaps](https://atcoder.jp/contests/abc250/tasks/abc250_c)
    • 题目大意
    • 输入格式
    • 输出格式
    • 样例
    • 分析
    • 代码
  • [D - 250-like Number](https://atcoder.jp/contests/abc250/tasks/abc250_d)
    • 题目大意
    • 输入格式
    • 输出格式
    • 样例
    • 分析
    • 代码
  • [E - Prefix Equality](https://atcoder.jp/contests/abc250/tasks/abc250_e)
    • 题目大意
    • 输入格式
    • 样例
      • 样例输入
      • 样例输出
    • 分析
    • 代码

C - Adjacent Swaps

题目大意

NNN个球从左到右排成一列。开始时,从左往右的第iii个球上写着数字iii
请执行QQQ个操作,第iii个操作如下:

  • 令j=Nj=~Nj= N个球中写着数字xix_ixi​的球的位置
  • 如果j=Nj=Nj=N,将其与第j−1j-1j−1个球交换;否则,与第j+1j+1j+1个球交换。

求所有操作后的球上分别写的数字。详见输出格式。

2≤N≤2×1052\le N\le 2\times 10^52≤N≤2×105
1≤Q≤2×1051\le Q\le 2\times 10^51≤Q≤2×105
1≤xi≤N1\le x_i\le N1≤xi​≤N

输入格式

NQN~QN Q
x1x_1x1​
⋮\vdots⋮
xQx_QxQ​

输出格式

令ai=Na_i=Nai​=N个球中从左往右的第iii个在所有操作结束后写的数,则按如下格式输出:
a1a2…ana_1~a_2~\dots~a_na1​ a2​ … an​
将a1,…,ana_1,\dots,a_na1​,…,an​按顺序输出到一行,用空格隔开

样例

略,请自行前往AtCoder查看。

分析

根据数据范围可得,本题只能使用时间复杂度不超过O(N+Qlog⁡n)\mathcal O(N+Q\log n)O(N+Qlogn)的算法
因此,暴力模拟,即查找每个球对应的位置jjj(O(NQ)\mathcal O(NQ)O(NQ))肯定是行不通的。

但是很容易想到可以设置索引数组ppp,使当ai=xa_i=xai​=x时,px=ip_x=ipx​=i。
这样,对于每一个操作,只需O(1)\mathcal O(1)O(1)的时间复杂度就能找到xix_ixi​出现的位置。
交换时注意同时交换一下aaa和ppp中的元素即可。总时间复杂度O(N+Q)\mathcal O(N+Q)O(N+Q)。

代码

#include <cstdio>
#define maxn 200005
using namespace std;inline void swap(int& x, int& y) { x ^= y ^= x ^= y; }int pos[maxn], ans[maxn];int main()
{int n, q;scanf("%d%d", &n, &q);for(int i=1; i<=n; i++)ans[i] = pos[i] = i;while(q--){int x;scanf("%d", &x);int p1 = pos[x];int p2 = p1 == n? p1 - 1: p1 + 1;swap(pos[x], pos[ans[p2]]);swap(ans[p1], ans[p2]);}for(int i=1; i<=n; i++)printf("%d ", ans[i]);return 0;
}

D - 250-like Number

题目大意

当一个正整数kkk满足以下条件时,我们称其为“与250250250相似的”:

  • k=p×q3k=p\times q^3k=p×q3,其中p,qp,qp,q均为质数,且p<qp<qp<q。

求不超过NNN的“与250250250相似的”kkk的个数。

1≤N≤10181\le N\le 10^{18}1≤N≤1018

输入格式

NNN

输出格式

将答案输出为一个整数。

样例

NNN 输出
250250250 222
111 000
123456789012345123456789012345123456789012345 226863226863226863

分析

看到数据范围后我们发现NNN太大,不能盲目下手。
由k=p×q3,k≤Nk=p\times q^3,k\le Nk=p×q3,k≤N可知,p×q3≤N≤1018p\times q^3\le N\le 10^{18}p×q3≤N≤1018。
又因为p,qp,qp,q是质数,且p<qp<qp<q可得,2≤p<q2\le p<q2≤p<q。
因此,当ppp最小时qqq最大,所以q≤N=1018p=23≈794000q\le \sqrt[3]{\frac {N=10^{18}} {p=2}}\approx794000q≤3p=2N=1018​​≈794000。

这时,可以想到筛出质数表,并对于每个质数ppp计算最大的qqq,此时质数p<x≤qp<x\le qp<x≤q都能作为qqq,因此将答案加上p<x≤qp<x\le qp<x≤q的质数数量即可。当p≥qp\ge qp≥q时,退出循环,输出结果即可。

计算qqq时可以使用二分查找或者双指针算法快速处理。
总时间复杂度大约在O(n722)\mathcal O(n^{\frac 7 {22}})O(n227​)。

代码

本代码使用双指针实现。

#include <cstdio>
#include <cmath>
#include <vector>
#define maxp 794000
using namespace std;using LL = long long;bool bad[maxp];
vector<int> primes;inline LL pow3(LL x) { return x * x * x; }int main()
{bad[0] = bad[1] = true;for(int i=2; i<maxp; i++)if(!bad[i]){primes.push_back(i);for(int j=i<<1; j<maxp; j+=i)bad[j] = true;}LL n;scanf("%lld", &n);LL ans = 0LL;for(int i=0, j=primes.size()-1; i<j; i++){while(j >= 0 && primes[i] * pow3(primes[j]) > n) j --;if(i >= j) break;ans += j - i;}printf("%lld\n", ans);return 0;
}

E - Prefix Equality

题目大意

给定长度为NNN的正整数序列A=(A1,…,AN)A=(A_1,\dots,A_N)A=(A1​,…,AN​)和B=(B1,…,BN)B=(B_1,\dots,B_N)B=(B1​,…,BN​)。
对于每个1≤i≤Q1\le i\le Q1≤i≤Q,给定两个正整数xi,yix_i,y_ixi​,yi​,回答如下格式的查询:

  • 判断集合{A1,…,Axi}\{A_1,\dots,A_{x_i}\}{A1​,…,Axi​​}和{B1,…,Byi}\{B_1,\dots,B_{y_i}\}{B1​,…,Byi​​}是否相等。

集合可以说成是序列排序并去重的结果,如序列(9,3,5,3,4)(9,3,5,3,4)(9,3,5,3,4)对应的集合是{3,4,5,9}\{3,4,5,9\}{3,4,5,9}。

1≤N,Q≤2×1051\le N,Q\le 2\times 10^51≤N,Q≤2×105
1≤Ai≤Bi≤1091\le A_i\le B_i\le 10^91≤Ai​≤Bi​≤109
1≤xi,yi≤N1\le x_i,y_i\le N1≤xi​,yi​≤N

输入格式

NNN
A1…ANA_1~\dots~A_NA1​ … AN​
B1…BNB_1~\dots~B_NB1​ … BN​
QQQ
x1y1x_1~y_1x1​ y1​
⋮\vdots⋮
xQyQx_Q~y_QxQ​ yQ​

样例

样例输入

5
1 2 3 4 5
1 2 2 4 3
7
1 1
2 2
2 3
3 3
4 4
4 5
5 5

样例输出

Yes
Yes
Yes
No
No
Yes
No

分析

本题做法很多。这里我们介绍使用哈希(Hash)的算法。
现在我们有一个很简单但明显错误的思路:
将AAA和BBB做一个前缀和,只计算不重复的元素,即
PA(i)=∑{A1,…,Ai}PB(i)=∑{B1,…,Bi}P_A(i)=\sum\{A_1,\dots,A_i\}\\ P_B(i)=\sum\{B_1,\dots,B_i\} PA​(i)=∑{A1​,…,Ai​}PB​(i)=∑{B1​,…,Bi​}
此时,只需判断PA(xi)P_A(x_i)PA​(xi​)和PB(yi)P_B(y_i)PB​(yi​)是否相等即可。时间复杂度为O(N+Q)\mathcal O(N+Q)O(N+Q)或O(Q+Nlog⁡N)\mathcal O(Q+N\log N)O(Q+NlogN)。
构造hack数据也很简单,只需部分前缀和相等即可,如:

5
1 3 5 6 7
3 2 4 1 5
1
3 3

这样,因为1+3+5=3+2+4=91+3+5=3+2+4=91+3+5=3+2+4=9,所以这样的程序会认为这是相等的序列,从而输出Yes,但显然{1,3,5}≠{3,2,4}\{1,3,5\}\ne\{3,2,4\}{1,3,5}={3,2,4},因此答案为No,程序错误。

现在考虑改进这个思路,使其不容易被hack,可以使用一个哈希函数:
H(x)=x(x+A)(x+B)modPH(x)=x(x+A)(x+B)\bmod P H(x)=x(x+A)(x+B)modP
其中A,B,PA,B,PA,B,P一般取质数,H(x)H(x)H(x)即为xxx对应的哈希值。(对PPP取模是为了防止哈希值太大导致溢出)
显然,这样有一个很小的概率会产生哈希冲突(即不同的数得到相同的哈希值),但因为A,B,PA,B,PA,B,P的取值太多,评测机没法针对性的hack,所以正常情况下都能通过(CF的Hack机制除外)。如果真担心有问题,可以采取双哈希,即对于一个xxx,用两个不同的哈希函数计算哈希值,这样就几乎不可能出现哈希冲突了。

现在,前缀和变为:
PA(i)=∑{H(A1),…,H(Ai)}modPPB(i)=∑{H(B1),…,H(Bi)}modPP_A(i)=\sum\{H(A_1),\dots,H(A_i)\}\bmod P\\ P_B(i)=\sum\{H(B_1),\dots,H(B_i)\}\bmod P PA​(i)=∑{H(A1​),…,H(Ai​)}modPPB​(i)=∑{H(B1​),…,H(Bi​)}modP
还是按原来的思路,判断前缀和是否相等即可。
总时间复杂度为O(n)\mathcal O(n)O(n)(unordered_set/HashSet)或O(nlog⁡n)\mathcal O(n\log n)O(nlogn)(set/TreeSet)。

代码

这里还是要提一点,就是使用哈希时有一个小技巧,即直接取P=232−1P=2^{32}-1P=232−1(unsigned int)或者P=264−1P=2^{64}-1P=264−1(unsigned long long),使整数自然溢出,省去了麻烦又耗时间的取模步骤。CodeForces上还是建议取较大的质数(常用的有109+7,99824435310^9+7,998244353109+7,998244353)作为PPP,以免被hack导致丢分。

这里我用的哈希函数为H(x)=x(x+93)(x+117)mod(232−1)H(x)=x(x+93)(x+117)\bmod(2^{32}-1)H(x)=x(x+93)(x+117)mod(232−1),即A=93,B=117,P=232−1A=93,B=117,P=2^{32}-1A=93,B=117,P=232−1。

#include <cstdio>
#include <unordered_set>
#define maxn 200005
using namespace std;inline int read()
{char c;while((c = getchar()) < '0' || c > '9');int res = c ^ 48;while((c = getchar()) >= '0' && c <= '9')res = (res << 3) + (res << 1) + (c ^ 48);return res;
}unsigned suma[maxn], sumb[maxn];
inline void hread(unsigned* psum, int n)
{unordered_set<int> s;for(int i=1, x; i<=n; i++){psum[i] = psum[i - 1];if(s.insert(x = read()).second)psum[i] += x * unsigned(x + 93) * unsigned(x + 117);}
}int main()
{int n = read();hread(suma, n);hread(sumb, n);for(int q=read(); q--;)puts(suma[read()] == sumb[read()]? "Yes": "No");return 0;
}

AtCoder Beginner Contest 250 C~E 题解相关推荐

  1. AtCoder Beginner Contest 246 A~E 题解 Bishop 2

    AtCoder Beginner Contest 246 A~E 题解 A Four Points 题意 给你矩形的三个顶点,输出剩下那个 思路 把横坐标和纵坐标分开,必会存在两个相同的数,横纵坐标就 ...

  2. AtCoder Beginner Contest 252 A~G 题解

    前言 这是我第一次写7题(A~G)的ABC题解,若有写得不好或者不到位的地方请多多指教,我将万分感激,感谢大家的支持! ABC252 A~G [A - ASCII code](https://atco ...

  3. AtCoder Beginner Contest 196 A~E题解

    ABC196 A~E [A - Difference Max](https://atcoder.jp/contests/abc196/tasks/abc196_a) 题目大意 输入格式 输出格式 样例 ...

  4. AtCoder Beginner Contest 177 A~D 题解

    ABC177 A~D [A - Don't be late](https://atcoder.jp/contests/abc177/tasks/abc177_a) 题目大意 输入格式 输出格式 样例 ...

  5. AtCoder Beginner Contest 168 C~D题解

    ABC168 C&D [C - : (Colon)](https://atcoder.jp/contests/abc168/tasks/abc168_c) 题目大意 输入格式 输出格式 样例 ...

  6. AtCoder Beginner Contest 242 C~E 题解

    ABC242 C~E [C - 1111gal password](https://atcoder.jp/contests/abc242/tasks/abc242_c) 题目大意 输入格式 输出格式 ...

  7. AtCoder Beginner Contest 192 A~D题解

    ABC192 A~D [A - Star](https://atcoder.jp/contests/abc192/tasks/abc192_a) 题目大意 输入格式 输出格式 样例 分析 代码 [B ...

  8. AtCoder Beginner Contest 254 A~E 题解

    ABC254 A~E [A - Last Two Digits](https://atcoder.jp/contests/abc254/tasks/abc254_a) 题目大意 输入格式 输出格式 样 ...

  9. AtCoder Beginner Contest 205 A~E 题解

    ABC205 A~E [A - kcal](https://atcoder.jp/contests/abc205/tasks/abc205_a) 题目大意 输入格式 输出格式 样例 分析 代码 [B ...

最新文章

  1. android 锁屏画面开发,android 锁屏应用开发
  2. 【12c新特性】12c中如何自动启动PDB Pluggable Database
  3. [YTU]_2477( C++习题 抽象基类)
  4. 事务之五:Spring @Transactional工作原理
  5. python计算机知识点,最新最全Python基础的知识点复习完整版.pdf
  6. python多线程下载文件
  7. Week4——Hello.java分析
  8. 剑指Offer_47_求1+2+3+...+n
  9. 先进先出算法_数据结构与算法之初识栈与队列
  10. 图像增强算法效果评价指标及实现
  11. XLua系列讲解_Helloworld
  12. onkeyup+onafterpaste
  13. Django + mysql + 微信 抢票之本地环境搭建
  14. 在刚创建的云服务器如何git克隆自己的私人仓库
  15. c#上位机plc通讯读位
  16. 马克思主义哲学(哲学概论)
  17. 2022-2028全球与中国无线电源接收器市场现状及未来发展趋势
  18. GitHub上优秀的Go开源项目
  19. 求助!matlab软件下SVM(支持向量机)做回归预测,软件版本为2016b看,老是报错看,不知道怎么解决这个问题。
  20. Linux系统目录管理

热门文章

  1. 网络信息安全管理之资产、脆弱性、威胁、风险
  2. 机器视觉光源的分类及各种光源的特点
  3. Android培训班 4
  4. 领导驾驶舱在企业中逐渐占领地位
  5. 数据大屏领导驾驶舱大数据分析UI1-4(PSD-持续更新)
  6. 微信提现到零钱 CA_ERROR报错总结
  7. html5 监控系统界面,基于WEB服务器实现监控系统的视频图像显示
  8. 构建自己的碎片知识体系
  9. 2018年全国多校算法寒假训练营练习比赛(第五场)解题报告
  10. python生成随机整数列表_python生成随机整数