码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces 1110E (差分)

时间:2019-02-09 10:41:40      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:iostream   相等   ble   mes   inline   不能   algorithm   判断   return   

题面

传送门

分析

一开始考虑贪心和DP,发现不行

考虑差分:

设d[i]=c[i+1]-c[i] (i<n)

那么一次操作会如何影响差分数组呢?

\(c[i]'=c[i+1]+c[i-1]-c[i]\)

\(d'[i-1]=c[i]'-c[i-1]=c[i+1]-c[i]=d[i]\)

\(d'[i]=c[i]-c[i-1]=d[i-1]\)

我们发现操作只是改变了差分数组中不同值的位置

因此,我们只要求出c,t对应的差分数组,并比较它们是否相同即可

注意由于c[1]和c[n]不能变,所以要判断c[1]和t[1],c[n]和t[n]是否相等

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#define maxn 100005 
using namespace std;
int n;
int a[maxn];
int b[maxn];
int da[maxn];
int db[maxn];
int is_eqal(int *a,int *b,int sz){
    sort(a+1,a+1+sz);
    sort(b+1,b+1+sz);
    for(int i=1;i<=sz;i++){
        if(a[i]!=b[i]) return 0;
    }
    return 1;
} 
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    for(int i=1;i<=n;i++){
        scanf("%d",&b[i]);
    }
    for(int i=1;i<n;i++){
        da[i]=a[i+1]-a[i];
    }
    for(int i=1;i<n;i++){
        db[i]=b[i+1]-b[i];
    }
    if(a[1]!=b[1]||a[n]!=b[n]){
        printf("No\n");
    }else{
        if(is_eqal(da,db,n-1)) printf("Yes\n");
        else printf("No\n");
    } 
}

Codeforces 1110E (差分)

标签:iostream   相等   ble   mes   inline   不能   algorithm   判断   return   

原文地址:https://www.cnblogs.com/birchtree/p/10357170.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!