zoukankan      html  css  js  c++  java
  • [CF1110E] Magic Stones

    Description

    给定两个数列 (c,t),每次操作可以选择一个 (i),令 (c_i leftarrow c_{i+1}+c_{i-1}-c_i),问进行若干次操作后,是否能使得数列 (c)(t) 相等。

    Solution

    分析差分序列,将 (c_{i-1},c_i,c_{i+1}) 变为 (c_{i-1},c_{i-1}+c_{i+1}-c_i,c_{i+1}) 后,差分序列从 (c_i-c_{i-1},c_{i+1}-c_i) 变为 (c_{i+1}-c_i,c_{i}-c_{i-1}),即差分序列的相邻两项交换了。

    因此每次操作的实质就是交换差分序列的相邻两项。

    于是,若原序列满足 (c_1=t_1,c_n=t_n),我们只需要比较差分序列的元素多重集是否相等即可。

    #include <bits/stdc++.h>
    using namespace std;
    
    #define int long long
    const int N = 1000005;
    
    int n,c[N],t[N],a[N],b[N];
    
    int solve()
    {
        if(c[1]==t[1] && c[n]==t[n])
        {
            for(int i=1;i<=n;i++)
            {
                a[i]=c[i]-c[i-1];
                b[i]=t[i]-t[i-1];
            }
            sort(a+1,a+n+1);
            sort(b+1,b+n+1);
            for(int i=1;i<=n;i++)
            {
                if(a[i]!=b[i])
                {
                    return false;
                }
            }
            return true;
        }
        else
        {
            return false;
        }
    }
    
    signed main()
    {
        ios::sync_with_stdio(false);
    
        cin>>n;
        for(int i=1;i<=n;i++) cin>>c[i];
        for(int i=1;i<=n;i++) cin>>t[i];
    
        cout<<(solve()?"Yes":"No");
    }
    
    
  • 相关阅读:
    算法之冒泡排序(Java语言)
    算法之水仙花数(Java语言)
    md5加密解析
    Java项目中环境变量的问题
    外行码农进阶学习指导思想
    初识TCP
    const修饰符总结
    网格计算的三种体系结构概述
    虚函数的实现
    网络计算概述
  • 原文地址:https://www.cnblogs.com/mollnn/p/13649706.html
Copyright © 2011-2022 走看看