打卡信奥刷题(1884)用C++实现信奥 P9714 「QFOI R1」摸摸

P9714 「QFOI R1」摸摸

题目描述

小 R 是一个可爱的女孩子,她喜欢被摸头。

但是摸头之前,必须答对她提出的一个问题。

她有一个长度为 nnn 的数列 aaa,初始时所有元素均为 000。另有两个长度为 nnn 的数列 t,bt,bt,b

她可以进行两种操作:

  1. tttttt 的倒序对应元素相加,得到新的 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]
  2. aaattt 对应元素相加,得到新的 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 行,每行一个为 YesNo 的字符串,表示每组数据是否可能将 aaa 变为 bbb

字符串不区分大小写,如果答案为 Yes 的话,yesYESyEs 等都将被判为正确。

输入输出样例 #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 nn 表示每组数据的 nnn 之和。

对于全部数据,保证 1≤∑n≤2×1031\le\sum n\le 2\times 10^31n2×103n≥1n\ge 1n11≤ti,bi≤2×1031\le t_i,b_i\le 2\times 10^31ti,bi2×103

  • 对于测试点 1∼41\sim 414:保证 n≤2n\le 2n2
  • 对于测试点 5∼85\sim 858:保证所有 tit_iti 都相等。
  • 对于测试点 9∼129\sim 12912:保证 bi=bn−i+1b_i=b_{n-i+1}bi=bni+1
  • 对于测试点 13∼1613\sim 161316:保证 ∑n,ti,bi≤200\sum n,t_i,b_i\le 200n,ti,bi200
  • 对于测试点 17∼2017\sim 201720:无特殊限制。

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考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值