题解:P14757 武汉之泪

· · 题解

题目大意

给你两个长度为 n 的序列 ab,可以对序列 a 执行以下操作:

问能否通过若干次操作将序列 a 变为 b

解题思路

实现方法

时间复杂度为 O(n)

代码

#include <bits/stdc++.h>
using namespace std;
int n;
long long int a[200005],b[200005];
long long int val[200005],delt[200005];
void solve(){
    cin>>n;
    for(int i=1;i<=n;i++){
        val[i]=0;
        delt[i]=0;
    }
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    for(int i=1;i<=n;i++){
        cin>>b[i];
    }
    int la=1,lena=0;
    while(la<=n){
        if(la!=n&&a[la+1]-a[la]==1){
            la++;
            delt[1]+=2;
            delt[lena+1]-=2;
        }
        else{
            lena++;
            val[lena]=a[la];
        }
        la++;
    }
    int lb=1,lenb=0;
    while(lb<=n){
        if(lb!=n&&b[lb+1]-b[lb]==1){
            lb++;
            delt[1]-=2;
            delt[lenb+1]+=2;
        }
        else{
            lenb++;
            val[lenb]-=b[lb];
        }
        lb++;
    }
    long long int cur=0;
    if(lena!=lenb){
        cout<<"NO"<<"\n";
        return ;
    }
    for(int i=1;i<=n;i++){
        cur+=delt[i];
        val[i]+=cur;
        if(val[i]!=0){
            cout<<"NO"<<"\n";
            return ;
        }
    }
    cout<<"YES"<<"\n";
    return ;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int T;
    cin>>T;
    while(T--) solve();
    return 0;
}