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
    ");
    	} 
    }
    
    
  • 相关阅读:
    分形之城
    【SDOI2011 第2轮 DAY1】消防 树上问题+二分+贪心
    【Usaco Nov08 Gold】玩具 三分+贪心
    分治 复习
    快读板子
    最小线段覆盖 C神奇项链
    比赛经验积累1
    字符串 专题
    界面小项目之W3C
    前端小基础
  • 原文地址:https://www.cnblogs.com/birchtree/p/10357170.html
Copyright © 2011-2022 走看看