QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#110029 | #5570. Epidemic Escape | 2024zll | WA | 2ms | 5596kb | C++14 | 3.3kb | 2023-05-31 10:28:21 | 2023-05-31 10:28:23 |
Judging History
answer
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
namespace IO{
const int ARR_SIZE=1<<20;
#define gc() ((IO::si!=IO::ti||(IO::ti=(IO::si=IO::input)+fread(IO::input,1,IO::ARR_SIZE,stdin))),IO::si!=IO::ti?*(IO::si++):EOF)
char input[ARR_SIZE],*si=input,*ti=input;
template<typename T>
void read(T&num){
bool flag=true;
int ch=gc();
num=0;
while(ch<48||ch>57){
if(ch=='-')flag=false;
ch=gc();
}
while(ch>=48&&ch<=57)num=num*10+(ch^48),ch=gc();
flag||(num=-num);
}
}
using IO::read;
typedef double real;
const int maxn=100000,maxk=5;
const real eps=1e-16;
int n,q;
struct Vector{
real x,y;
Vector(const real x=0,const real y=0):x(x),y(y){}
friend bool operator<(const Vector&A,const Vector&B){
return A.x!=B.x?A.x<B.x:A.y<B.y;
}
friend Vector operator-(const Vector&A,const Vector&B){
return Vector(A.x-B.x,A.y-B.y);
}
friend Vector operator/(const Vector&A,const real&x){
return Vector(A.x/x,A.y/x);
}
friend real Cross(const Vector&A,const Vector&B){
return A.x*B.y-A.y*B.x;
}
friend real Dot(const Vector&A,const Vector&B){
return A.x*B.x+A.y*B.y;
}
}P[maxn],Q;
bool used[maxn];
std::vector<int>down[maxk],up[maxk],stack;
void PolygonToConvex(std::vector<int>&down,std::vector<int>&up,std::vector<int>&stack){
int end=n-1;
while(end>=0&&used[end])end--;
if(end==-1)return;
stack.resize(n*2);
int top=-1;
for(int i=0;i<=end;i++){
if(used[i])continue;
while(top>0&&Cross(P[stack[top]]-P[stack[top-1]],P[i]-P[stack[top]])<=0)top--;
stack[++top]=i;
}
const int k=top;
for(int i=end-1;i>=0;i--){
if(used[i])continue;
while(top>k&&Cross(P[stack[top]]-P[stack[top-1]],P[i]-P[stack[top]])<=0)top--;
stack[++top]=i;
}
stack.resize(top+1);
for(int i:stack)used[i]=true;
down.assign(stack.begin(),stack.begin()+k+1);
if(k<top)up.assign(stack.begin()+k+1,stack.begin()+top+1);
}
int k;
real DotPQ[maxn];
struct CMP{
bool operator()(const int x,const int y)const{
return DotPQ[x]>DotPQ[y];
}
}cmp;
std::priority_queue<int,std::vector<int>,CMP>queue;
int vis[maxn],now_id;
void push(const int x){
if(vis[x]==now_id)return;
vis[x]=now_id;
if((DotPQ[x]=Dot(P[x],Q))<=eps)return;
queue.push(x);
if((int)queue.size()>k)queue.pop();
}
void solve(std::vector<int>&vec,const bool flag){
if((int)vec.size()<=k)
for(int i:vec)
push(i);
else{
if(flag){
int l=0,r=(int)vec.size()-2,mid;
while(l<r){
mid=(l+r)>>1;
if(Dot(Q,P[vec[mid+1]]-P[vec[mid]])<0)r=mid;
else l=mid+1;
}
for(int i=std::max(0,l-k),lim=std::min((int)vec.size()-1,l+k);i<=lim;i++)push(vec[i]);
}
}
}
int main(){
read(n);
for(int i=0;i<n;i++)read(P[i].x),read(P[i].y),P[i]=P[i]/Dot(P[i],P[i]);
std::sort(P,P+n);
for(int i=0;i<maxk;i++)PolygonToConvex(down[i],up[i],stack);
read(q);
memset(vis,-1,sizeof(int)*n);
for(int i=0,x,y;i<q;i++){
now_id=i;
read(x),read(y),read(k);
if(x==0&&y==0){
puts("-1");
continue;
}
Q=Vector(x,y);
Q=Q/sqrt(Dot(Q,Q));
while(!queue.empty())queue.pop();
for(int j=0;j<k;j++)solve(down[j],y<0);
for(int j=0;j<k;j++)solve(up[j],y>0);
if((int)queue.size()<k)puts("-1");
else printf("%.7lf\n",(real)0.5/Dot(P[queue.top()],Q));
}
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 2ms
memory: 5488kb
input:
5 5 -3 5 4 -6 2 -5 0 4 1 2 -3 -10 1 6 -9 1
output:
8.7002554 3.2260196
result:
ok 2 numbers
Test #2:
score: 0
Accepted
time: 2ms
memory: 4740kb
input:
8 4 -1 4 -8 0 9 4 -7 -5 -2 5 -5 7 5 -9 2 10 4 -8 1 7 -7 5 -10 8 2 -9 9 2 4 -7 5 -1 -10 2 6 -3 2 2 -9 3 -10 -10 1 5 9 1
output:
3.1677630 26.1629509 5.4614883 6.3639610 -1 5.2894082 3.7267800 4.6097722 2.9294424 4.7617289
result:
ok 10 numbers
Test #3:
score: -100
Wrong Answer
time: 2ms
memory: 5596kb
input:
5 -4 -7 5 0 2 4 -7 -7 4 4 20 0 -5 2 -4 -7 2 -7 7 3 4 -4 3 -7 4 3 4 -4 1 2 4 1 6 -7 2 4 -4 2 4 4 3 5 4 1 -1 9 2 8 9 3 4 -4 2 6 3 3 -10 -3 2 -7 7 1 9 -4 1 -4 -7 3 -2 0 2
output:
7.0000000 5.1305277 -1 -1 -1 3.5355339 2.2360680 11.9854078 15.3206469 3.5355339 2.4627401 4.5276926 3.7629983 15.3206469 2.9814240 5.6217035 7.0710678 2.7357938 -1 -1
result:
wrong answer 20th numbers differ - expected: '8.1250000', found: '-1.0000000', error = '1.1230769'