Round #504 D. Array Restoration .

题目:http://codeforces.com/contest/1023

对于一个长度n的数组进行q次查询,i从1到q,第i次将任意一段连续的部分全部染成i。

最后得到的数组中可能会存在“污点”0.即最后对数组的任意子集set为0.

给出n和q,以及带污点的长为n的数组,判断是否能将其还原成没有0的合理数组。

如果可以则输出任意一合理数组。

思路:先统计每个数的出现的最左位置和最右位置,然后从q到1查询,判断q的最左到最右中间有没有不合理的数(小于q)。

因为一定会有q次查询所有最后至少有一个q存在,否则就是被0覆盖了,所以要先判断q、0的存在问题。

如果无q有0,就将最左的0设置为q(其实任意了);

然后在判断是否合理,如果第i次判断时遇到了0可以直接将0设置为i,注意判断时一定要跳过已经判断了的部分。

注意初始化时的范围选择


#include<cstdio>

const int maxn = 200015;
int n,q,a[maxn],r[maxn],l[maxn],fa[maxn];

int mfind(int x){return fa[x]==x?x:fa[x]=mfind(fa[x]);}
int m_max(int i,int j){return i>j?i:j;}
int m_min(int i,int j){return i<j?i:j;}

int main(){
    scanf("%d%d",&n,&q);
    for(int i=0;i<=q;i++){//note is q
        r[i]=0;
        l[i]=n;
    }

    for(int i=0;i<n;i++){
        scanf("%d",a+i);
        r[a[i]]=m_max(r[a[i]],i);
        l[a[i]]=m_min(l[a[i]],i);
    }

    for(int i=0;i<=n;i++)fa[i]=i;//note can equ n

    if(l[q]>r[q]){
        if(l[0]>r[0]){
            puts("NO");
            return 0;
        }

        a[l[0]]=q;
        fa[l[0]]=mfind(l[0]+1);
    }

    for(int i=q;i;i--){
        for(int j=mfind(l[i]);j<=r[i];j=mfind(j)){
            if(a[j]<i&&a[j]){
                 puts("NO");
                return 0;
            }

            a[j]=i;
            fa[j]=mfind(j+1);
        }
    }

    puts("YES");
    for(int i=0;i<n;i++)
        printf("%d ",a[i]?a[i]:1," \n"[i==n-1]);
    return 0;
}

原文地址:https://www.cnblogs.com/lingyuanchuang/p/9498599.html

时间: 2024-08-30 10:39:30

Round #504 D. Array Restoration .的相关文章

Codeforces Round #504 D. Array Restoration

Codeforces Round #504 D. Array Restoration 题目描述:有一个长度为\(n\)的序列\(a\),有\(q\)次操作,第\(i\)次选择一个区间,将区间里的数全部改为\(i\),序列\(a\)的每个位置至少被改一次.得到最终的序列,然后将序列里的某些位置变成\(0\),输出一种可能的置零之前的最终序列,或无解. solution 求出每种数字最长的染色区间,按这个区间染色,记下没出现的数字.染色后如果存在\(0\)联通块,则用没出现的数字从大到小染色(一个联

Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final) D. Array Restoration

D. Array Restoration time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Initially there was an array aa consisting of nn integers. Positions in it are numbered from 11 to nn. Exactly qq querie

Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final) A. Single Wildcard Pattern Matching B. Pair of Toys C. Bracket Subsequence D. Array Restoration-区间查询最值(RMQ(ST))

Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final) A. Single Wildcard Pattern Matching 题意就是匹配字符的题目,打比赛的时候没有看到只有一个" * ",然后就写挫了,被hack了,被hack的点就是判一下只有一个" * ". 1 //A 2 #include<iostream> 3 #include<cstdio&g

Educational Codeforces Round 21 D. Array Division

题目链接:Educational Codeforces Round 21 D. Array Division 题意: 给你n个数,现在你可以改变1<=个数的位置,然后问你是否存在有一个k,使得sum(a[i])(1<=i<=k)==sum(a[j])(k+1<=j<=n) 题解: 分析: 如果需要将一个数移动,无非就是将这个数从第一部分移到第二部分,或者从第二部分移到第一部分. 所以,我们只需要开两个map来记录一下两部分有哪些数. 当两部分的差值/2等于其中一部分的一个数时

Codeforces #504(div1+div2) 1023D Array Restoration(线段树)

题目大意:给你一个数组,数组是经过q次区间覆盖后的结果,第i次覆盖是把区间内的值赋值为i,其中有若干个地方数值未知(就是0),让你判断这个数组是否可以经过覆盖后得到的,如果可以,输出任意一种可行数组. 思路:不合法的情况只有2种.1:两个相同的数字中间出现了比它小的数字,比如: 6 5 6 就不合法,因为覆盖6的时候是覆盖连续的一段区间,而5比6先覆盖,所以这种情况不存在.我赛后看AC代码的时候发现有的人只是判断是否出现谷形的情况,这种是不对的. 比如这种样例:3 3 3 1 2 这种判断方法会

codeforces Round 63-div2-D.Beautiful Array(线性动归)

原题地址 D. Beautiful Array You are given an array aa consisting of nn integers. Beauty of array is the maximum sum of some consecutive subarray of this array (this subarray may be empty). For example, the beauty of the array [10, -5, 10, -4, 1] is 15, a

Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)

考场上只做出了ABDE C都挂了... 题解: A 题解: 模拟 判断前面一段是否相同,后面一段是否相同,长度是否够(不能有重叠) Code: 1 #include<stdio.h> 2 #include<cstring> 3 #include<cstdlib> 4 #include<algorithm> 5 #include<vector> 6 #include<map> 7 #include<set> 8 #inclu

Codeforces Round #504 E - Down or Right 交互题

1023E 题意: 交互题.在一个有障碍地图中,问如何走才能从(1,1)走到(n,n),只能向右或者向左走.每次询问两个点,回复你这两个点能不能走通. 思路: 只用最多2*n-2次询问.从(1,1),能向右走就向右走,不能就向下走,直到走到斜对角线上.从(n,n)出发,能向上走就向上走,不能就向左走,直到走到斜对角线上. 因为保证有路,所以最后输出(1,1)出发的正向路径,加上从(n,n)出发的反向路径. #include <algorithm> #include <iterator&g

$Codeforces\; Round\; 504\; (Div.2)$

宾馆的\(\rm{wifi}\)也太不好了,蹭的\(ZZC\)的热点才打的比赛(感谢\(ZZC\)) 日常掉rating-- 我现在是个\(\color{green}{pupil}\)-- 因为我菜,所以还是只写了前三道题 题解 \(\mathcal{A.Single\; Wildcard\; Pattern\; Matching}\) 题目大意:有点长,不想翻译了qwq 我能说第一题是前三道题中最难的么--各种特判,各种被卡,最后交了4遍也没做出来(我太蒟了 QAQ) 反复修改后的冗杂的AC代