小 D 有一个长度为 n 的整数序列 ai(下标从 1开始编号,下同),她想通过若干次操作把它变成序列 bibi。
小 D 有 mm种可选的操作,第 ii 种操作可使用三元组 (ti,ui,vi) 描述:
小 D 可以以任意顺序执行操作,且每种操作都可进行无限次。
现在给定序列与所有操作,请你帮她判断是否存在一种方案能将 ai 变为bi。题目保证两个序列长度都为 n。
若方案存在请输出 YES
,否则输出 NO
。
本题输入文件包含多组数据。
第一行一个正整数 T 表示数据组数。
对于每组数据:
第一行两个整数 n,m 表示序列长度与操作种数。
第二行 n 个整数表示序列 ai。
第三行 n 个整数表示序列 bi。
接下来 m 行每行三个整数 ti,ui,vi,第 ii 行描述操作 ii。
注意:同一个三元组 (ti,ui,vi)可能在输入中出现多次。
对于每组数据输出一行一个字符串 YES
或 NO
表示答案。
对于测试点 1∼51∼5:n=2,m=1,ai,bi≤99,u1≠v1,t1=1
对于测试点 6∼106∼10:n=2,m=1,ai,bi≤99,u1≠v1,t1=2
对于测试点 11∼1211∼12:n=2,ai,bi≤99,ui≠vi
对于测试点 13∼1613∼16:ti=2
对于测试点 1717:n,m≤20。
对于测试点 1818:n,m≤1000。
对于所有测试点:1≤T≤10,1≤n,m≤105,1≤ai,bi≤109,ti∈{1,2},1≤ui,vi≤n
3
1 1
1
3
1 1 1
2 3
1 2
4 5
1 1 2
2 1 2
1 1 2
3 3
1 2 3
5 5 4
1 1 2
1 1 3
2 2 3
YES
YES
YES
第一组数据:使用一次操作 1。
第二组数据:使用三次操作 1。
第三组数据:使用三次操作 1,令 a1,a2 都增加 3,再使用一次操作 2,令 a1,a3 都增加 1。
特点:数组内只有两个数
经过分析,可得
只有第一种操作:数组中两位数的差值相等
只有第二种操作:数组中两位数和相等
#include
using namespace std;
int a[100010], b[100010], t[100010], x, y;
bool st[3];
int main()
{
int T;
cin >> T;
while(T--)
{
memset(st, false, sizeof st);
int n,m;
cin >> n >> m;
for(int i=0 ; i<n ; i++)
cin >> a[i];
for(int i=0 ; i<n ; i