T1 crazy
给定一颗n节点有权值的树,定义疯子树,满足:
①为原图的一个子图
②将所有节点按权值排序后的b1,b2,b3…bn,满足对于i<n,bi到bi+1上的点的路径(不包含bi+1)不存在权值大于w[bi]的点;
n<=200000;
题解:
①定义b1为疯子树的中心,则从中心发出的每一条链一定递增。(可以考虑不断构造的过程简易证明)
②如果选取每一个点去辐散,需要n^2,考虑bfs只扩展比当前节点权值大的点之后会得到一颗树,且以我们选取的点为根。因为每个点在不同情况下的贡献是一样的,所以每次搜完记忆一下,可以达到O(n);
T2 little
给定一个数n,求其分解成k(k不定)个数乘积的方案,满足这k个数的差不大于1;(若有无限多组解,输出-1)
n≤10^18
题解:
①只有满足2^k的数输出-1;
②考虑分解后一定为n = a^k1 * (a+1)^k2 ;所以
a^(k1+k2) < n < (a+1) ^(k1+k2) 意思就是知道了k的话,把n开k次跟就好了。
③至于k的范围,就是lg n,10^18还是可以应付的,至于开根可以用pow求k分之一次幂;
T3 cake
给定一个边长为1的正n边形,求能够包含它的最小正m边形的边长;
大概不爆long long; 保留四位小数;
①有一个很邪恶的骗分做法:求出n边形的外接圆,再求出以这个圆的外接m边形,一点数学知识就可以,因为精度要求很低,所以竟然过了80。。。。;
②
来自YYT学长: 考虑求出内外边长的关系,最小化m边形的边长即最大化OC,因为m边形所有的m个小三角形全等,把OA…OC全部旋转到一个小三角形内,那么最大的情况一定是当有任意两条相邻线刚好碰到多边形的边的时候(如图中OB,OC),所以只要求出∠B‘OC’,结合m变形的边心距和三角函数,就可以得到关系;
(好像多画了一个C,不要介意。。。)
③把2π分成m*n份,那么m边形的圆心角为n,n边形的圆心角为m,旋转群即(a + k*m) % n一个的群,会形成一个在mod n的意义下内相差为gcd(m,n)的剩余系;所以∠B‘OC’ = 2π / (n*m) * gcd(m,n) = 2π / lcm(m,n) ;
结束了。(发出长长的叹息。。。)
T4 grass
有n个草,生长的速度为a1 – an ,有m个操作: di bi 在第di天将所有长度大于bi的草的长度割为bi,草的初始长度都为0,求每次操作割的草的总单位长度;
n,m<=4 * 10^5;
①有一个看似无用的条件:草的初始长度都为0;由此可得到生长速度快的不论怎么减,草的长度一定不会小于生长速度慢的;将草按降序a排序,我们只需要区间修改维护前面某段的sum值,相对的位置一定不会改变,统计答案的话就用sum - tot * bi就好了
②线段树和splay应该都是可以做的 :设立ly1 和 ly2 两个标记表示,分别表示集体被砍成ly1 和 生长 ly2(注意ly1 可以 覆盖 ly2),其余就是数据结构的基本操作;