CF1110E Magic Stones

传送门

我一开始以为每个位置只有可能是2个值,然后就GG了
然后摸了一眼题解,这tm怎么这个简单
仔细观察它的式子\(c_i=c_{i-1}+c_{i+1}-c_i\)
和差分有点像,看看差分数组\(d_i=c_i-c_{i-1}\)
容易发现每一次操作都是将\(d_i\)\(d_{i+1}\)交换了
那么只需要满足差分数组相同就可以了
代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
void read(int &x) {
    char ch; bool ok;
    for(ok=0,ch=getchar(); !isdigit(ch); ch=getchar()) if(ch=='-') ok=1;
    for(x=0; isdigit(ch); x=x*10+ch-'0',ch=getchar()); if(ok) x=-x;
}
#define rg register
const int maxn=1e5+10;
int n,m,a[maxn],b[maxn],c[maxn],d[maxn];
int main()
{
    read(n);
    for(rg int i=1;i<=n;i++)read(a[i]);
    for(rg int i=1;i<=n;i++)read(b[i]);
    if(a[1]!=b[1]||a[n]!=b[n]){printf("No\n");return 0;}
    for(rg int i=1;i<=n;i++)c[i]=a[i]-a[i-1];
    for(rg int i=1;i<=n;i++)d[i]=b[i]-b[i-1];
    sort(c+1,c+n+1),sort(d+1,d+n+1);
    for(rg int i=1;i<=n;i++)if(c[i]!=d[i]){printf("No\n");return 0;}
    printf("Yes\n");
}

猜你喜欢

转载自www.cnblogs.com/lcxer/p/10364713.html