AcWing 杂题集

1427 序列

题目

小 D 有一个长度为 n 的整数序列 ai(下标从 1开始编号,下同),她想通过若干次操作把它变成序列 bibi。

小 D 有 mm种可选的操作,第 ii 种操作可使用三元组 (ti,ui,vi) 描述:

  • 若 ti=1,则她可以使 aui 与 avi 都加一或都减一;
  • 若 ti=2,则她可以使 aui 减一、avi 加一,或是 aui 加一、avi 减一,因此当 ui=vi 时,这种操作相当于没有操作。

小 D 可以以任意顺序执行操作,且每种操作都可进行无限次。

现在给定序列与所有操作,请你帮她判断是否存在一种方案能将 ai 变为bi。题目保证两个序列长度都为 n。

若方案存在请输出 YES,否则输出 NO

输入格式

本题输入文件包含多组数据。

第一行一个正整数 T 表示数据组数。

对于每组数据:

第一行两个整数 n,m 表示序列长度与操作种数。

第二行 n 个整数表示序列 ai。

第三行 n 个整数表示序列 bi。

接下来 m 行每行三个整数 ti,ui,vi,第 ii 行描述操作 ii。

注意:同一个三元组 (ti,ui,vi)可能在输入中出现多次。

输出格式

对于每组数据输出一行一个字符串 YESNO 表示答案。

数据范围

对于测试点 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。

解题思路

1~12数据点(60分)

特点:数组内只有两个数

经过分析,可得

只有第一种操作:数组中两位数的差值相等

只有第二种操作:数组中两位数和相等

#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

你可能感兴趣的:(c++)