2019牛客多校第七场
荣膺全场罚时最高,为什么今天和昨天都是6题,今天的我却没有了昨天的快乐呢。。。
A. String
solve at 00:28
给你一个\(01\)字符串\(s\),你要将它分割成数量尽可能少的若干个串,使得每个串都是它的所有循环同构串中字典序最小的\((1<=T<=300, 1<=|s|<=200)\) 看上去就感觉贪心是对的,就是每次尽可能选最长的符合条件的串,然后套一个最小表示法就过了
1 |
|
B. Irreducible Polynomial
solved at 04:50(+38)
是的,这就是我们荣获罚时冠军的原因
题意是给你一个多项式,询问这个多项式能否在实数域内因式分解
然后我就口胡了一个假算法,即判断这个函数有没有零点(这是不对的,x4+2x2+1$没有实数域上的零点,然而显然可以因式分解)
于是我们就写了模拟退火求最小值,牛顿迭代求零点等方法,调了无数次的参。。。
正解是这样的:
首先\(n\)次方程在复数域上有\(n\)个根,若\(f(\omega)=0\),则\(f(\overline \omega)=0\), 即原函数可以提取出\((x-\omega)(x-\overline \omega)\),而这两个东西乘起来就没有虚数部分了,因此三次及以上的多项式在实数域上一定可以因式分解
零次和一次显然不可以,二次看判别式。。。
C. Governing sand
solved at 02:51(+7)
有\(n\)种树,每种树有高度,数量以及砍伐代价,你要砍掉一些树使得最高的树的数量超过一半,求最小代价\((1<=n<=1e5)\)
和杭电多校第三场的1007几乎一样,从小到大枚举高度线段树维护数量和代价就好了
1 |
|
D. Number
solved at 00:11
给你一个\(n\)和一个\(p\),你要输出一个\(n\)位数,且是\(p\)的倍数
如果\(n\)小于\(p\)的位数则无解,否则直接输出\(p\),后面补上足够的\(0\)即可
E. Find the median
upsolved
你有一个初始为空的数列,\(n(1<=n<=4e5)\)次操作,每次给定一个区间\(L, R\),你将区间里所有数加入到数列中,然后求数列的中位数(偶数个取较小值)
将\(R[i]\)全部自增1后离散化,会得到至多\(2n\)个点,实际上每个点代表一个区间,代表的是大于等于当前这个点且小于后一个点的区间,对这些点建线段树,维护区间里数的总数以及区间被更新了多少次(非叶子节点的这个值只用于延迟更新,只有叶子节点的参与最终计算),然后支持查询第\(k\)大的数就好了
1 |
|
H. Pair
solved at 04:18(+1)
给你三个数\(A, B, C(1<=A,B,C<=1e9)\), 求满足\(1<=i<=A\ \&\&\ 1<=j<=B\ \&\& (i\ and\ j>C\ ||\ i\ xor\ j<C)\)的\((i,j)\)对数量
正着不太好求,我们反过来求\(i\ and\ j<=C \ \&\&\ i\ xor\ j >=C\)的数量
考虑二进制数位\(dp\),从高位往低位考虑,一共有五维
第一维表示已经填了几位,第二维表示当前已经填的位的\(and\)是比\(C\)大还是一样大,第三位表示已经填的位的\(xor\)是比\(C\)小还是一样大,第四五维表示已经填的数和\(A,B\)的关系(是一样大还是已经更小了)后四维都是为\(0\)表示相等
转移的时候枚举当前位这两个数分别填\(0\)还是\(1\),不合法的情况就不转移
注意这样最后可能填的数是\(0\),而题目要求大于等于\(1\),考虑一下就好了
复杂度\(O(T2^6\log {1e9})\)
1 |
|
J. A+B problem
solve at 00:07
定义\(f(x)\)为把\(x\)各位数倒过来的数,给你\(A, B\), 求\(f(f(A) + f(B))\)
牛客能交python好评