社区讨论
口胡一下gdoi普及题目的思路,求助看一下方法对不对
学术版参与者 5已保存回复 11
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 11 条
- 当前快照
- 1 份
- 快照标识符
- @lo90iyca
- 此快照首次捕获于
- 2023/10/28 03:35 2 年前
- 此快照最后确认于
- 2023/10/28 03:35 2 年前
第一题
第一题因为只有英语名字,且字符串长度不超过三,我相当于hash,把名字给映射为一个整数,每一次建议在数组里加上对应贡献,如果贡献大于最大值则更新最大值,并更新最大值的名字。
第二题
第二题考场上没有想出来,欢迎大佬来交流。
第三题
第三题我的想法是因为说在树中,孩子的时间代价是小于等于父节点的时间代价,而且按照他的规则,如果可能有时间更小的方案,那必然是要把当前最大一个拆分才有希望,否则只会增加数量,从而导致增加代价(拆小的没意义)。所以我就写了一个优先队列(大根堆)每次把第一个出队,他的孩子入队(没孩子的就结束程序),记录每一次的最小值。因为每个节点最多入队一次,出队一次,调整堆的复杂度是logn,所以总复杂度应该是O(nlogn)
第四题
第四题的我想的就是枚举公差,然后同一个公差间答案可以表示为(不会用Latex):x+2之类的为下标(每个下标都要再乘上公差)
sigma(pi(Ax * Ax+1 * Ax+2 * Ax+L-1)* (1+ Ax+L+ Ax+L * Ax+L+1 + ...+pi(Ax+L * Ax+L+1 * ... * Ax+r-1))
然后我们发现那个模数为素数,然后想到了费马小定理,预处理100000以下每个数的p-2次方模p的值,从而实现O(1)转移pi(Ax * Ax+1 * Ax+2 * Ax+L-1),以及O(1)转移pi(Ax+L * Ax+L+1 * ... * Ax+r-1),从而O(1)转移整个式子,如果遇到0的话,就可以直接跳过L个,再暴力乘上这L个,本质上还是O(1)。所以复杂度应该是max(ai)* sigma(1/i),i只需要加到l就可以了,最多不过100000,那sigma那一部分最大值也就是10-20左右,从而解决这个问题了。但是考场上感觉细节有点多,没有码出来。
第二三四题 如果各位有不同的思路,或者证伪了我的算法,欢迎讨论。
我把我第一三题的代码贴在一楼吧
回复
共 11 条回复,欢迎继续交流。
正在加载回复...