P9714 「QFOI R1」摸摸
题目描述
小 R 是一个可爱的女孩子,她喜欢被摸头。
但是摸头之前,必须答对她提出的一个问题。
她有一个长度为 nnn 的数列 aaa,初始时所有元素均为 000。另有两个长度为 nnn 的数列 t,bt,bt,b。
她可以进行两种操作:
- 将 ttt 与 ttt 的倒序对应元素相加,得到新的 ttt。
- 例如,t=[1,4,2]t=[1,4,2]t=[1,4,2] 变为 t′=[1+2,4+4,2+1]=[3,8,3]t'=[1+2,4+4,2+1]=[3,8,3]t′=[1+2,4+4,2+1]=[3,8,3]。
- 将 aaa 与 ttt 对应元素相加,得到新的 aaa。
- 例如,a=[1,2,3],t=[1,4,2]a=[1,2,3],t=[1,4,2]a=[1,2,3],t=[1,4,2] 变为 a′=[1+1,2+4,3+2]=[2,6,5]a'=[1+1,2+4,3+2]=[2,6,5]a′=[1+1,2+4,3+2]=[2,6,5]。
是否可能通过若干次以上操作将 aaa 变为 bbb?
你希望摸她的头 TTT 次,因此有 TTT 组数据。
输入格式
第一行一个整数 TTT,表示数据组数。
对于每组数据:
- 第一行一个整数 nnn,表示数列长度。
- 第二行 nnn 个整数,第 iii 个整数为 tit_iti。
- 第三行 nnn 个整数,第 iii 个整数为 bib_ibi。
输出格式
共 TTT 行,每行一个为 Yes 或 No 的字符串,表示每组数据是否可能将 aaa 变为 bbb。
字符串不区分大小写,如果答案为 Yes 的话,yes、YES、yEs 等都将被判为正确。
输入输出样例 #1
输入 #1
2
3
1 2 2
5 8 7
3
1 2 2
2 4 3
输出 #1
Yes
No
说明/提示
样例解释
对于第一组数据:
- 初始时:a=[0,0,0]a=[0,0,0]a=[0,0,0],t=[1,2,2]t=[1,2,2]t=[1,2,2],b=[5,8,7]b=[5,8,7]b=[5,8,7]。
- 执行操作二:a=[1,2,2]a=[1,2,2]a=[1,2,2],t=[1,2,2]t=[1,2,2]t=[1,2,2],b=[5,8,7]b=[5,8,7]b=[5,8,7]。
- 执行操作二:a=[2,4,4]a=[2,4,4]a=[2,4,4],t=[1,2,2]t=[1,2,2]t=[1,2,2],b=[5,8,7]b=[5,8,7]b=[5,8,7]。
- 执行操作一:a=[2,4,4]a=[2,4,4]a=[2,4,4],t=[3,4,3]t=[3,4,3]t=[3,4,3],b=[5,8,7]b=[5,8,7]b=[5,8,7]。
- 执行操作二:a=[5,8,7]a=[5,8,7]a=[5,8,7],t=[3,4,3]t=[3,4,3]t=[3,4,3],b=[5,8,7]b=[5,8,7]b=[5,8,7]。
此时 a=ba=ba=b,符合要求。
对于第二组数据,可以证明不存在合法方案。
数据范围
本题共 202020 个测试点,每个测试点 555 分。
记 ∑n\sum n∑n 表示每组数据的 nnn 之和。
对于全部数据,保证 1≤∑n≤2×1031\le\sum n\le 2\times 10^31≤∑n≤2×103,n≥1n\ge 1n≥1,1≤ti,bi≤2×1031\le t_i,b_i\le 2\times 10^31≤ti,bi≤2×103。
- 对于测试点 1∼41\sim 41∼4:保证 n≤2n\le 2n≤2。
- 对于测试点 5∼85\sim 85∼8:保证所有 tit_iti 都相等。
- 对于测试点 9∼129\sim 129∼12:保证 bi=bn−i+1b_i=b_{n-i+1}bi=bn−i+1。
- 对于测试点 13∼1613\sim 1613∼16:保证 ∑n,ti,bi≤200\sum n,t_i,b_i\le 200∑n,ti,bi≤200。
- 对于测试点 17∼2017\sim 2017∼20:无特殊限制。
Hack 数据
本题在赛后添加了 Hack 数据,从 212121 开始编号。
原有测试点依然计 555 分,Hack 数据计 000 分,但只有通过所有数据才会被判为 Accepted。
为区分原有测试点和 Hack 数据,本题添加了子任务,但子任务的计分方式为“加和”,不会影响正常评测。
C++实现
#include<bits/stdc++.h>
using namespace std;
int n,t[2005],b[2005];
void sol(){
cin>>n;
for(int i=1;i<=n;i++) cin>>t[i];
for(int i=1;i<=n;i++) cin>>b[i];
for(int i=1;i*t[1]<=b[1];i++) {
int x=b[1]-i*t[1];
if(x%t[n]) continue;
for(int j=2;j<=n;j++)
{
int p=b[j]-i*t[j];
if(p%t[n-j+1]||p/t[n-j+1]!=x/t[n]||i<x/t[n]) goto pp;
}
puts("Yes");
return;
pp:;
}
puts("No");
}
int main()
{
int t;
cin>>t;
while(t--) sol();
return 0;
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
用C++实现信奥 P9714 「QFOI R1」摸摸&spm=1001.2101.3001.5002&articleId=150510595&d=1&t=3&u=0ca6dbce21b1489cbb2b2f158a52bcca)
675

被折叠的 条评论
为什么被折叠?



