离线赛11.3

来源:互联网 发布:顽固软件卸载 编辑:程序博客网 时间:2024/06/07 16:43

一、excellent数
数据:对于20%,n∈[1,6]
对于70%,n∈[1,1000]
对于100%,n∈[1,1e6]

暴力显然只能过20%的。注意题目要求是两个都满足good数,那么枚举一维使其为good数后,再判定。枚举一下a的个数和b的的个数就行了。如果可以,只要再组合数就行了。组合数如果用公式求是n^2的,太慢了,可以用逆元求,这样是n log n

二、数字分割
数据:对于80%,n∈[1,300]
对于100%,n∈[1,3000]

显然是dp。定义dp[i][j] 为第i个数往前,最后一个数为j开头。那么只要再和前一个数判断就行了。和前面的数判断也只要判断和现在的长度相同的,长度短的肯定比较小,这里用前缀和维护一下就行。判断如果循环判断,就是n^3的了。那么就预处理从另个点往后的最长前缀。这个也是dp,从后往前,如果A[i]=A[j],那么长度就从C[i+1][j+1] 处加一。那么判断两个数字的大小也就变成了O(1),这样就是O(n^2)了。

三、远离班主任
数据:
这里写图片描述

前30分只需要直接把所有点算出来就行了。
链的时候就只有三种情况:最远点在最左端、最右端和两个数之间,也很好判断。从链上考虑树上。抽出直径,然后也就变成了链,只是每个点的权值都变了,要用一些数据结构来维护。如果在左边和右边的话,是很简单的,只要加减一下就行了。如果在中间,要分两种情况一种点向左,一种向右。对于向左的,值是ID[x]-ID[a]+D[x]+dis[a],其中ID是抽出来的链的坐标,dis是这个点到所在子树的跟的距离,D是这棵子树上最长的那条边。同理推出右边的:ID[b]-ID[y]+D[y]+dis[y]。那么按照递推式发现其中D和dis是不变的,那么就在线段树里放这两个,然后取max,在把ID的值加上去。具体的实现就是先抽链,然后线段树。

考试时最后一题想到了抽链,但是没有时间来debug了,链打完就算了。

原创粉丝点击