跳转至

2020-2021 ICPC Southeastern European Regional Programming Contest (SEERC 2020)

排名 当场过题数 至今过题数 总题数
82/? 7 8 13

A

upsolved by TYB

题意

给出序列\(p\),你需要给整数序列\(a\)赋值,使得\(\sum_{i=1}^na_i\times p_i\)最大,并满足:

\(1.a_0=a_{n+1}=0\)

\(2.\forall i\in[0,n],|a_i-a_{i+1}|\le1\)

求这个最大值。

\(n\le2.5\times10^5,-10^6\le p_i\le10^6\)

题解

考虑换一种计算贡献的方式,设\(s\)\(p\)的前缀和:

\(\forall i\in[0,n-1]\)\(a_i<a_{i+1},ans-=s_i\)

\(\forall i\in[0,n-1]\)\(a_i>a_{i+1},ans+=s_{i+1}\)

看一下题目中的图片,就会觉得比较显然。

然后这就转换成一个经典问题:每天物品有一个价格,一天中只可以买入/卖出一次,求最后的最大收益。

妙啊。

B

solved by YZW

题意

题解

C

**upsolved by **

题意

题解

D

solved by YZW

题意

略。

题解

人类智慧题。

E

solved by TYB

题意

签到。

题解

略。

F

solved by JLK

题意

有一个长度为\(n\)的排列,一次操作可以选定一个区间,把区间内所有数变成区间最小值。求做若干次操作后可能产生的序列数。

\(1 \le n \le 3000\)

题解

最后的序列中,如果一个数\(A_i\)变成了\(A_j\),那么一定有$\min\limits_{k=i}^j A_k=A_j $。

\(dp_{i,j}\)表示前\(i\)个数确定了,第\(i\)个数变成了\(A_j\),的方案数。

转移到\(dp_{i+1,k}\),分类讨论。首先一定要满足上面的要求。

1、\(j \le i\)

如果\(k \le i\),那么一定有\(A_k \ge A_j\),否则\(A_k\)覆盖到\(i+1\)的时候会破坏\(i\)

如果\(k \gt i\),那么无论\(j\)是多少都可以。

2、\(j \gt i\)

如果\(k \lt j\),那么\((i,j)\)\((i+1,k)\)一定会产生重叠,不可能。

如果\(k \ge j\),那么需要满足\(A_k \le A_j\)(实际上直接用上面的min条件判断即可)。

用前缀和转移即可做到\(O(n^2)\)

G

**upsolved by **

题意

题解

H

**upsolved by **

题意

题解

I

solved by JLK

题意

给定\(n\),求有多少\(1,2,\dots ,n\)的排列\(p\),使得\(p_i \mod p_{(i+1)\%n} \le 2\)对每个\(i\)都成立。

\(1 \le n \le 10^6\)

题解

考虑从\(n\)转移到\(n+1\),插入\(n+1\),要让插入后前面和后面的模的结果都不超过\(2\),那么前面肯定只能是\(1\)或者\(2\),右后面必须是\(n-1,n,n+1\)其中一个的因子。

首先有一个普通的DP:\(dp_{i,j,k}\)表示\(n=i\)时,\(1\)\(2\)后面分别是\(j\)\(k\)的方案数。

转移的时候,要么插入到\(1\)后面,要么插入到\(2\)后面,还要枚举后面的数(因子)。

每个数总共只会枚举三次因子,所以总复杂度为\(O(n^3\log n)\)

不难发现\(j,k\)其中有一个肯定等于\(i\),而且我们并不关心是\(1\)还是\(2\)。所以只用记两个数,\(dp_{i,j}\)表示\(n=i\)\(1\)\(2\)后面不是\(n\)的数是\(j\)的方案数。

转移的时候也很简单,如果插入到\(i\)前面,那么就相当于是\(dp_{i,*}\)原封不动变成\(dp_{i+1,*}\)。而另一种情况下,\(k\)就会变成\(i\),只需要枚举因子,转移到\(dp_{i+1,i}\)即可。

\(O(n\log n)\)

J

**upsolved by **

题意

题解

K

**upsolved by **

题意

题解

L

solved by TYB

题意

\(n\)个二元组\((a_i,b_i)\),求最大的\(k\),使得将\(n\)个数分成\(3\)类(可以为空),满足第一类数和第二类数都有恰好\(k\)个,且第一类数的\(\sum a>=\)第二类数的\(\sum b\)

\(n\le10^5\)

题解

考虑如果没有第三类数,可以直接默认一开始都是第一类数,然后计算出每个数改为第二类数的贡献,取前\(k\)个即可。

那么想办法把三类数转换成两类数。可以发现,将\(b_i\)从大到小排序,最优方案存在一个分界点,使得左边只有第一类数和第三类数,右边只有第一类数和第二类数,对左右两边分别套用两类数的方法即可。

还需要二分答案,复杂度\(\mathcal{O}(n\log^2n)\)

M

solved by YZW

题意

题解

记录

JLK过B(0:13),TYB E WA一次后AC(0:19),YZW M RE一次后AC(0:47)。

TYB和YZW对I打表,JLK想别的题,后来讨论了一下会I了。

JLK写I,TLE一次后AC(1:42)。TYB写L,WA一次后AC(2:29)。

YZW大力分类讨论写D,JLK和TYB看AFH。

YZW过D(3:34)。但是其他题没有进展。讨论后会了F,JLK开始写。

TYB猜了一下H,顶下JLK开始写,然后WA了,发现假了。

JLK继续写,WA一次后AC(4:27)。

最后想出了H正解,但是没时间写了。

总结

JLK:1e6以内数的因子就不要用vector存了

Dirt

E(-1)

F(-1)

I(-1)

L(-1)

M(-1)