题面

传送门

题解

orzxyx

首先我们发现,一个点如果被到达大于一次,那么这个点肯定在一个环上。所以在不考虑环的情况下每个点只会被到达一次,那么我们就可以直接暴力了

简单来说,我们对每个点\(i\)预处理一下\(to[i][from]\),表示如果有一条绳子从\(from\)绕到\(i\),那么绕上\(i\)之后这条绳子对应的下一个点是哪个(假设绳子无限长)。这个可以通过对所有点按极角排序之后直接预处理出来

接下来考虑环,我们可以用类似取模的手段,找到一个环之后把整圈直接跑掉,剩下的继续暴力

建议看代码比较好理解

//minamoto
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
R int res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
const int N=2005;const double Pi=acos(-1.0),eps=1e-8;
struct node{
int x,y;
node(){}
node(R int xx,R int yy):x(xx),y(yy){}
inline node operator -(const node &b)const{return node(x-b.x,y-b.y);}
inline double norm(){return sqrt(1ll*x*x+1ll*y*y);}
inline double PA(){return atan2(y,x);}
}p[N],s,t;
struct qwq{
int pos;double dis,alp;
qwq(){}
qwq(R int P,R double D,R double A):pos(P),dis(D),alp(A){}
inline bool operator <(const qwq &b)const{return fabs(alp-b.alp)>eps?alp<b.alp:dis<b.dis;}
}a[N][N];
int n,m,to[N][N];double len;
int solve(int pos,int from,double len){
if(from==n+1){
double res=(p[pos]-s).PA()+4*Pi;
fp(i,1,3*n-3)
if(a[pos][i].alp<res-eps&&a[pos][i].dis<len)return 1+solve(a[pos][i].pos,pos,len-a[pos][i].dis);
return 0;
}
int ans=0,top=0,nxt;
static int st[N],vis[N];
fp(i,1,n)vis[i]=0;
st[++top]=pos;
while(!vis[pos]){
vis[pos]=top,nxt=0;
fp(i,to[pos][from],3*n-3)
if(a[pos][i].dis<len){
++ans,nxt=a[pos][i].pos,len-=a[pos][i].dis;
break;
}
if(!nxt)return ans;
from=pos,pos=nxt,st[++top]=pos;
}
int bg=vis[pos];
fp(T,bg,top-1){
nxt=0;
fp(i,to[pos][from],3*n-3)
if(a[pos][i].dis<len){
++ans,nxt=a[pos][i].pos,len-=a[pos][i].dis;
break;
}
if(!nxt)return ans;
from=pos,pos=nxt;
if(pos!=st[T+1])return ans+solve(pos,from,len);
}
double res=0;
fp(i,bg,top-1)res+=(p[st[i]]-p[st[i+1]]).norm();
int q=len/res;
len-=q*res,ans+=(top-vis[pos])*q;
return ans+solve(st[top],st[top-1],len);
}
int main(){
// freopen("testdata.in","r",stdin);
for(int T=read();T;--T){
n=read(),m=read();
fp(i,1,n)p[i].x=read(),p[i].y=read();
for(R int i=1;i<=n;++i){
int top=0;
fp(j,1,i-1)a[i][++top]=qwq(j,(p[j]-p[i]).norm(),(p[j]-p[i]).PA());
fp(j,i+1,n)a[i][++top]=qwq(j,(p[j]-p[i]).norm(),(p[j]-p[i]).PA());
sort(a[i]+1,a[i]+1+top);
fp(j,1,top){
a[i][j+top]=a[i][j+(top<<1)]=a[i][j];
a[i][j+top].alp+=2*Pi,a[i][j+(top<<1)].alp+=4*Pi;
}
reverse(a[i]+1,a[i]+top*3+1);
for(R int j=1,pos=1;j<=top;++j){
while(a[i][j].alp-a[i][pos].alp<=Pi-eps)++pos;
to[i][a[i][j].pos]=pos;
}
}
while(m--){
s.x=read(),s.y=read(),t.x=read(),t.y=read(),len=read();
static qwq st[N];int top=0;
st[++top]=qwq(n+1,len,(t-s).PA());
fp(i,1,n)st[++top]=qwq(i,(p[i]-s).norm(),(p[i]-s).PA());
sort(st+1,st+1+top);
fp(i,1,top)st[i+top]=st[i],st[i+top].alp+=2*Pi;
reverse(st+1,st+1+(top<<1));
fp(i,1,top)if(st[i].pos==n+1){
int pos=0;
fp(k,i+1,i+top)if(st[k].dis<len-eps){pos=k;break;}
printf("%d\n",!pos?1:2+solve(st[pos].pos,n+1,len-st[pos].dis));
break;
}
}
}
return 0;
}

uoj#344. 【清华集训2017】我的生命已如风中残烛(计算几何)的更多相关文章

  1. UOJ273 [清华集训2016] 你的生命已如风中残烛 【数学】

    题目分析: 把$0$卡牌看成$-1$.题目要求前缀和始终大于等于$1$. 最后添加一个$-1$,这样除了最后一位之外大于等于1,最后一位等于0. 构造圆排列.这样的话一个圆排列只有一个满足的情况,然后 ...

  2. 洛谷 P6672 - [清华集训2016] 你的生命已如风中残烛(组合数学)

    洛谷题面传送门 题解里一堆密密麻麻的 Raney 引理--蒟蒻表示看不懂,因此决定写一篇题解提供一个像我这样的蒟蒻能理解的思路,或者说,理解方式. 首先我们考虑什么样的牌堆顺序符合条件.显然,在摸牌任 ...

  3. P6672-[清华集训2016]你的生命已如风中残烛【结论】

    正题 题目链接:https://www.luogu.com.cn/problem/P6672 题目大意 长度为\(m\)的序列\(a\),有\(n\)个数字不是\(0\),其他\(m-n\)个是\(0 ...

  4. 【UOJ#340】【清华集训2017】小 Y 和恐怖的奴隶主(矩阵快速幂,动态规划)

    [UOJ#340][清华集训2017]小 Y 和恐怖的奴隶主(矩阵快速幂,动态规划) 题面 UOJ 洛谷 题解 考虑如何暴力\(dp\). 设\(f[i][a][b][c]\)表示当前到了第\(i\) ...

  5. [LOJ#2329]「清华集训 2017」我的生命已如风中残烛

    [LOJ#2329]「清华集训 2017」我的生命已如风中残烛 试题描述 九条可怜是一个贪玩的女孩子. 这天她在一堵墙钉了 \(n\) 个钉子,第 \(i\) 个钉子的坐标是 \((x_i,y_i)\ ...

  6. Loj #2331. 「清华集训 2017」某位歌姬的故事

    Loj #2331. 「清华集训 2017」某位歌姬的故事 IA 是一名会唱歌的女孩子. IOI2018 就要来了,IA 决定给参赛选手们写一首歌,以表达美好的祝愿.这首歌一共有 \(n\) 个音符, ...

  7. Loj #2324. 「清华集训 2017」小 Y 和二叉树

    Loj #2324. 「清华集训 2017」小 Y 和二叉树 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙上, ...

  8. Loj #2321. 「清华集训 2017」无限之环

    Loj #2321. 「清华集训 2017」无限之环 曾经有一款流行的游戏,叫做 *Infinity Loop***,先来简单的介绍一下这个游戏: 游戏在一个 \(n \times m\) 的网格状棋 ...

  9. Loj 2320.「清华集训 2017」生成树计数

    Loj 2320.「清华集训 2017」生成树计数 题目描述 在一个 \(s\) 个点的图中,存在 \(s-n\) 条边,使图中形成了 \(n\) 个连通块,第 \(i\) 个连通块中有 \(a_i\ ...

  10. loj #2325. 「清华集训 2017」小Y和恐怖的奴隶主

    #2325. 「清华集训 2017」小Y和恐怖的奴隶主 内存限制:256 MiB时间限制:2000 ms标准输入输出 题目类型:传统评测方式:文本比较   题目描述 "A fight? Co ...

随机推荐

  1. springboot成神之——websocket发送和请求消息

    本文介绍如何使用websocket发送和请求消息 项目目录 依赖 DemoApplication MessageModel WebConfig WebSocketConfig HttpHandshak ...

  2. 四道腾讯的javascript面试题

    今天整理自己的文件夹时,发现了曾经面试腾讯实习生时的被问挂了的面试题,我将它们整理好了供大家借鉴.当时要求的是手写代码.汗啊,我那时弱爆了! 1,将给定数组转换为一个随机数组 Array.protot ...

  3. sql代码段添加数据

      declare @i int,@index int     set @i=1     set @index=0   while @i<1000000   begin    set @inde ...

  4. component to string 自定义窗体

    component to string string to component StringToComponent ComponentToString ObjectTextToBinary Objec ...

  5. PHP的Enum(枚举)的实现

    转载请保留原文地址:http://www.cnblogs.com/zsxfbj/p/php_enum.html PHP其实有Enum类库的,需要安装perl扩展,所以不是php的标准扩展,因此代码的实 ...

  6. 记录MongoDB常用查询

    {$and:[{"}}]} // flag不等于1 也不等于0 {$or:[{"flag" :{ $ne:"1"}},{"flag" ...

  7. java之yield(),sleep(),wait()区别详解-备忘笔记(转)

    1.sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁.也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据.注意该方 ...

  8. C#中插入换行符

    要让一个Windows Form的TextBox显示多行文本就得把它的Multiline属性设置为true. 这个大家都知道,可是当你要在代码中为Text属性设置多行文本的时候可能会遇到点麻烦:) 你 ...

  9. android解析xml文件的方式

    android解析xml文件的方式   作者:东子哥 ,发布于2012-11-26,来源:博客园   在androd手机中处理xml数据时很常见的事情,通常在不同平台传输数据的时候,我们就可能使用xm ...

  10. Linux ping不通外网

    在linux中ping www.baidu.com 无法ping通,可能原因是DNS没配置好 方法一: 修改vi /etc/resolv.conf  增加如下内容: nameserver 114.11 ...