zoukankan      html  css  js  c++  java
  • Codeforces 1110E (差分)

    题面

    传送门

    分析

    一开始考虑贪心和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
    ");
    	}else{
    		if(is_eqal(da,db,n-1)) printf("Yes
    ");
    		else printf("No
    ");
    	} 
    }
    
    
  • 相关阅读:
    176. Second Highest Salary
    175. Combine Two Tables
    172. Factorial Trailing Zeroes
    171. Excel Sheet Column Number
    169. Majority Element
    168. Excel Sheet Column Title
    167. Two Sum II
    160. Intersection of Two Linked Lists
    个人博客记录
    <meta>标签
  • 原文地址:https://www.cnblogs.com/birchtree/p/10357170.html
Copyright © 2011-2022 走看看