今天练了一场国外的区预赛的题目,除了个别题目卡了一会儿,整体做下来还是蛮顺的,最终8题
http://acm.hust.edu.cn:8080/judge/contest/view.action?cid=14846#rank
http://acm.hust.edu.cn:8080/judge/contest/view.action?cid=14846#overview
简单说一下几个题吧
C题:好题,感觉是做出来的题目中最难的吧,题目可以转换为给你n个坐标点(n<=100000),询问50000个点,对于每个点,输出点集中离这个点最近的点到这个点的欧几里得距离。
我们可以将答案写成绝对值的表达式,然后再去掉绝对值|ai-xi|+|bi-yi| 然后可以分情况讨论a 与 x b 与y的关系,然后就可以去掉绝对值了
就以a>=x b>=y为例吧
去掉绝对值后式子变成了a+b-x-y那么我们所需要求的便是-x-y的最小值而且x是小于等于a的,看到了没,就是一个区间最值啊,把x建成线段树,-x-y当做值插入线段树,每枚举一个a b,就将点集中所有y坐标小于等于b的点全部插入,然后查询1~a 所在区间的最小值mi ,用mi+a+b来更新答案
I 题:给你一个多边形上三个点的坐标,问你这个多边形最少可以为几边形,由于最多不超过1000,所以可以考虑暴力枚举边数,那么我们就知道了单位中心角2*pi/边数,然后求出三角形的外心,然后验证内部这三个角是否都为单位中心角的整数倍即可,判断一个浮点数是否是另一个数的整数倍可以判断三次
bool check(double cha,double mi)
{
int i;
int tmp= cha/mi;
double a=1.0*(tmp+1)*mi;
double b=1.0*(tmp-1)*mi;
double c=1.0*tmp*mi;
if(fabs(a-cha)<eps || fabs(b-cha)<eps || fabs(c-cha)<eps) return true;
return false;
}
F题:暴力枚举+表达式计算
G题:线段树敲了一大半才发现可以单调队列,囧,但已经敲了就交一个呗,于是果断超时,后来改用单调队列立刻AC
先破环,在原数组的后面拼接上一个一模一样的数组即可,然后处理出前缀和sum,那么在判断某一段连续区间(长为n)的前缀和是否都大于等于0的时候只需要判断这段区间内最小的sum到开头的差是否大于0,由于求的是定长区间的最值,所以可以用单调队列搞