Regionals 2011 Europe - Southwestern

今天练了一场国外的区预赛的题目,除了个别题目卡了一会儿,整体做下来还是蛮顺的,最终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,由于求的是定长区间的最值,所以可以用单调队列搞

你可能感兴趣的:(Regionals 2011 Europe - Southwestern)