CF1023D Array Restoration】的更多相关文章

思路: 使用set即可,细节很多,容易出错. 实现: #include <bits/stdc++.h> using namespace std; const int INF = 0x3f3f3f3f; ; int a[MAXN], l[MAXN], r[MAXN]; int main() { int n, q; while (cin >> n >> q) { ; i <= q; i++) { l[i] = INF; r[i] = -INF; } , cq = ;…
Codeforces Round #504 D. Array Restoration 题目描述:有一个长度为\(n\)的序列\(a\),有\(q\)次操作,第\(i\)次选择一个区间,将区间里的数全部改为\(i\),序列\(a\)的每个位置至少被改一次.得到最终的序列,然后将序列里的某些位置变成\(0\),输出一种可能的置零之前的最终序列,或无解. solution 求出每种数字最长的染色区间,按这个区间染色,记下没出现的数字.染色后如果存在\(0\)联通块,则用没出现的数字从大到小染色(一个联…
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 $$$a$$$ consisting of $$$n$$$ integers. Positions in it are numbered from $$$1$$$ to $$$n$$…
D. Array Restoration 题目链接:https://codeforces.com/contest/1023/problem/D 题意: 给出一个序列,现在要求对一个全为0的序列执行q次操作,每次操作都要选定一段区间然后将区间上面的值变为i(i为操作的次数).最终使得0序列变为之前给出的序列. 原序列中如果存在0,那么说明这个值是任意的. 最后要求输出经过q次操作之后的序列. 题解: 我们首先可以想到不可行的情况:在原序列中若存在一个数a,假设其出现次数大于1,那么两端为a的中间区…
题意:有一个长为n的序列,对其进行q次操作,第i次操作可以把连续的一段覆盖为i 现在给出操作后的序列,第i个数字为a[i],其中有一些为0的位置可以为任意值,要求构造任意一组合法的操作后的序列 无解输出NO n,q<=2e5,0<=a[i]<=q 思路:看不懂别人写的题解,照自己的思路写一个…… 首先将a[i]从大到小排序,若a[i]已经确定则将a[i]填到i左右两端连续的0中 然后判断q有没有在填完之后的序列中出现,若没有出现则找一段连续的0覆盖成q,找不到0则无解 前面两步能将数列填…
题解 非常容易想到的线段树, 还可以用并查集来. 还有一位大神用了$O(n)$ 就过了Orz 要判断是否能染色出输入给出的序列,必须满足两个条件: 1. 序列中必须存在一个$q$ 2. 两个相同的数$x$的中间不存在比 $ x$ 小的数 首先判断输入的数列中是否存在$q$, 若不存在$q$ 且没有 $a_i = 0$, 表示序列中一定没有$q$, 直接输出NO 若存在某个$a_i = 0$ , 将任意一个染成$q$即可 然后我们再查询两个相同的数$x$ 中是否存在比$x$ 小的数,用线段树来维护…
题目大意:给你一个数组,数组是经过q次区间覆盖后的结果,第i次覆盖是把区间内的值赋值为i,其中有若干个地方数值未知(就是0),让你判断这个数组是否可以经过覆盖后得到的,如果可以,输出任意一种可行数组. 思路:不合法的情况只有2种.1:两个相同的数字中间出现了比它小的数字,比如: 6 5 6 就不合法,因为覆盖6的时候是覆盖连续的一段区间,而5比6先覆盖,所以这种情况不存在.我赛后看AC代码的时候发现有的人只是判断是否出现谷形的情况,这种是不对的. 比如这种样例:3 3 3 1 2 这种判断方法会…
题意:给你两个数字\(x\)和\(y\),让你构造一个长度为\(n\)的序列,要求包含\(x\)和\(y\),并且排序后相邻两项的差值相等. 题解:有排序后相邻两项的差值相等可知,构造的序列排序后一定是一个等差数列,而题目给的\(x\)和\(y\)的范围很小,所以我们可以从\([1,50]\)来枚举公差\(d\),这个\(d\)必须要能整除\(x\)和\(y\)的差值,并且\([x,y]\)的所有数的个数整除\(d\)上取整后不大于\(n\),这样找到的第一个\(d\),一定是最优解,直接构造输…
D. Array Restoration 这题想一下就会发现是只要两个相同的数之间没有比它小的就可以,就是保存一下数第一次出现和最后一次出现的位置,然后查询一下这个区间就可以,如果有0的话就进行填充. 这个题我是用RMQ(ST)进行查询的,在初始化的时候,如果有0就把0变成2e5+1,因为数据最大2e5,然后区间查询就可以了,关于RMQ(ST),以前写过博客,有兴趣的可以看一下 RMQ(ST)详解 这个题坑点很多,首先如果这个序列一开始的最大值比m小,并且没有0,那么就是NO,有0就先把一个0变…
A. Yet Another Two Integers Problem 最优的操作中,\(k = \min(10, abs(a - b))\),记\(d=abs(a-b)\),最终的答案为\(ans = \lfloor \frac{d}{10} \rfloor + [10|d]\). B. Minimum Product 猜结论:最优的情况必定是先把可用次数尽可能地用在其中一个数,然后再将剩余操作尽可能地用在另外一个数上. 分别算出先a后b和先b后a的答案,然后取最小值即可. C. Yet An…