题目链接
这套题目比较简单,为了庆祝为数不多的AK,决定把题解发一下。233....
A. Smooth Visualization(UVALive 5870 Smooth Visualization)
签到题一个,搞搞搞就行了。
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
B. Arnooks's Defensive Line(UVALive 5871 Arnooks's Defensive Line )
因为看起来是单组数据,n=500000,cdq分治的话,算了下时间复杂度正好。于是就是一道cdq分治裸题。
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
C. Equivalence(UVALive 5872 Equivalence )
这题随便模拟就好了。做的时候uvalive崩掉了,于是连交了十来发。。
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
D. Tree Inspections (UVALive 5873 Tree Inspections )
这题题意是给你n个点,然后m个横线或者竖线,如果满足在直线上站着,能垂直看到60%以上的点的话,就输出PASSED。
横线和竖线情况相同,对于一个横线,只需要考虑他和相邻横线之间的看见的情况就可以了。可以分向上看和向下看两种情况。然后模拟一下就行了。
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
E. Social Holidaying(UVALive 5874 Social Holidaying)
这题直接最大匹配就过了。可以的就连双向边,然后最大匹配除以二
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
F. Orienteering(UVALive 5875 Orienteering)
这题发现不能背包距离,但是可以背包分数呀!于是愉快的背包出所有分数的最短距离。然后每个询问查一下就行了。查的时候随便查,二分什么的都行。暴力也能过。
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
G. Writings on the Wall(UVALive 5876 Writings on the Wall)
求两个串可重叠的相连有多少种情况,扩展kmp裸题。。当s后缀和t公共前缀等于s后缀长度的时候,就是可以拼接的时候。然后。。ans++
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
H. Robotic Traceur(UVALive 5877 Robotic Traceur)
就是最小步数的最短路,并没有发现什么坑。。
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
I. Shortest Leash(UVALive 5878 Shortest Leash)
其实我发这篇文的目的,就是说一下这道题。。
这道题上来就被秒了,然而我感觉这道题很神啊!赛后发现大家都是用黑科技过的。。怪不得过了那么多。。个人感觉我们的思路是“杠杠的”正确。
最后的答案,肯定是2^n种情况求出的点后排的凸包上的点。然后,假如我们已经用了前i个向量,而且求出了相应的凸包,那么,考虑第i+1个向量对当前的凸包的影响,就是把当前凸包向着i+1这个向量的两个方向拉伸了一些长度,稍微想象一下可以知道,这样的拉伸最多增加两个点啊!!于是,每次增加向量最多增加两个点。。于是,按顺序添加向量,维护凸包就可以了。。。
加向量,排凸包,加向量,排凸包。。复杂度O(n^2*log(n))。
#include
#include
#include
#include
using namespace std;
const double inf=1e10;
const double eps=1e-8;
double sqr(double x){
return x*x;
}
int sign(double x){
return (x>eps)-(x<-eps);
}
struct Point{
double x,y;
Point(double _x=0,double _y=0){
x=_x,y=_y;
}
Point operator+(const Point &a){
return Point(x+a.x,y+a.y);
}
Point operator-(const Point &a){
return Point(x-a.x,y-a.y);
}
void input(){
scanf("%lf%lf",&x,&y);
}
}p[1024],v[1024],res[1024];
double mult(Point sp,Point ep,Point op){
return (sp.x-op.x)*(ep.y-op.y)-(ep.x-op.x)*(sp.y-op.y);
}
bool operator<(const Point &l,const Point &r){
return l.y=0) top--;
res[++top]=pnt[i];
}
len=top;res[++top]=pnt[n-2];
for(i=n-3;i>=0;i--){
while(top!=len&&mult(pnt[i],res[top],res[top-1])>=0) top--;
res[++top]=pnt[i];
}
return top;
}
double dist(Point a,Point b){
return sqrt(sqr(a.x-b.x)+sqr(a.y-b.y));
}
int main(){
int n;
while(scanf("%d",&n),n){
p[0]=Point(0,0);
int m=1;
double ans=-inf;
for(int i=0;i