题面

50pts

首先当然是二分答案\(mid\),
对于每一个点,以它为圆心的圆,交上攻击轨道;
那么这个点到攻击轨迹的可达范围就是一段圆弧。

怎么求这段圆弧呢?

我们知道圆弧可以用其两端点对于圆心的弧度(角度)来表示。
已知三角形的三边\(R1,R2,Dist\),利用余弦定理,我们可以求出角\(θ\)。
然后我们也可以轻易得知\(C\)对于圆心\(A\)的弧度\(α\)。
那么圆弧两端点的弧度分别为\(α±θ\)。

假设一个圆弧覆盖正多边形的顶点,那么称圆弧和这个顶点可以匹配。
现在就是问:有没有一个攻击轨道内接正多边形偏转角度,
使得圆弧和正多边形的顶点存在完美匹配。

假设现在存在一种可行的方案,
如果这个正多边形没有一个顶点与某一个圆弧的一个端点重合的话,
那么我可以抖动这个正多边形直到其的一个顶点与某一个圆弧的一个端点重合为止,
这个我是想说,如果存在可行的方案,那么一定存在一种可行的方案,使得该正多边形有一个顶点与某个圆弧的一个端点重合。
由于圆弧的端点的个数有\(O(n)\),
所以枚举重合的那个端点,然后就可以通过这个端点确定正多边形的其他顶点。
然后就可以建出二分图,问是否有完美匹配了,完美匹配可以用\(Hungary\)或\(Maxflow\),\(O(n^3)\)解决。
复杂度是\(O(n^4 log n)\)的,可以过50分。

100pts

首先我们注意到,
虽然每个圆弧的端点对应一种偏转角度
这些偏转角度似乎遍布\(360°\),但其实这些偏转角度是可以\(mod 2*π/n\)的,因为正多边形的顶点互相等价。
所以说我们实际的最大偏转角度是不超过\(2*π/n\)。

先把所有偏转角度\(mod 2*π/n\)后,从小到大排序。
对于一个圆弧而言,由于最大的偏转角度不超过相邻两顶点间距
所以在偏转过程中,不能变得能匹配的顶点不超过\(1\)个,能变得不能匹配的顶点不超过\(1\)个。
也就是说,从\(0\)到最大偏转角度对应的残留网络的变化容量的边不超过\(2*n\)条。
所以我们利用网络流的退流,来只对残留网络进行局部修改。

具体而言:
1.删边
比如说一条\((u,v)\)的边容量变为\(0\),那么假如这条边有\(x\)的流量,那么肯定要把最大流减掉\(x\)。
然后要把这条边的双向容量归零。
从\(u\)到\(1\)找出总流量为\(x\)的增广路,把它们都流量翻转;这个可以直接用最大流来实现,限制住初始进入的流量不超过\(x\)即可;
同理,从\(T\)到\(v\)跑一遍最大流。
最后还要从\(1\)到\(T\)检查有没有别的增广路。
2.加边
这个直接加就好了,最后也要检查从\(1\)到\(T\)有没有新增的增广路。

一次退流/加边操作就是\(O(m)\)的,在本题中\(m=n^2(n?)\)
由于每个点只有一次会退流/加边,所以总共是\(O(n^3)\)。
加上预处理的网络流是\(O(n^3)\)的。

加上二分,总共是\(O(n^3 log n)\)。

代码

#include<bits/stdc++.h>
#define ll long long
#define db double
#define fo(i,x,y) for(int i=x;i<=y;i++)
#define fd(i,x,y) for(int i=x;i>=y;i--)
using namespace std;const int maxn=407,maxm=maxn*maxn;
const db pi=acos(-1);int n,m,Last=1;
db Step;struct P{int x,y;
}a[maxn];void Init(){scanf("%d%d",&n,&m);fd(i,n,1) scanf("%d%d",&a[i].x,&a[i].y);//random_shuffle(a+1,a+n+1);Step=2*pi/n;
}int N;
db q[maxn*2],L[maxn],R[maxn];
void newQuery(db x){while (x>=-pi+Step) x-=Step;while (x<-pi) x+=Step;q[++N]=x;
}
int fi[maxn],ne[maxm],la[maxm],va[maxm],tot,T;
void add(int a,int b,int c){tot++;ne[tot]=fi[a];la[tot]=b;va[tot]=c;fi[a]=tot;
}
void Add(int a,int b,int c){add(a,b,c);add(b,a,0);
}
int bz[maxn],id;
int sap(int v,int flow){bz[v]=id;if (v==T) return flow;for(int k=fi[v];k;k=ne[k])if (bz[la[k]]<id && va[k]){int i=sap(la[k],va[k]&flow);if (i){va[k]-=i;va[k^1]+=i;return i;}}return 0;
}
int go_flow(int St,int Next,int Lim=0x7fffffff){int res=0;T=Next;while (1){id++;int temp=sap(St,1);if (temp){res+=temp;if (res==Lim) break;}else break;}return res;
}
int Road[maxn][maxn],res;
int cnt[maxn];
bool check(db ang){fo(j,1,n){if (cnt[j]>=2) continue;db y=ang;fo(i,1,n){if (L[j]>R[j] && (L[j]<=y && y<=R[j]+pi*2 || L[j]-pi*2<=y && y<=R[j]) || L[j]<=R[j] && L[j]<=y && y<=R[j]){if (!Road[j][i]){Add(1+j,1+n+i,1);Road[j][i]=tot;//cnt[j]++;/*int z=go_flow(1+n+i,n+n+2)&go_flow(1,1+j);res+=z;va[tot]^=z;va[tot^1]^=z;*/if (cnt[j]){cnt[j]++;break;}}}else{if (Road[j][i]){int k=Road[j][i];if (va[k]){va[k]=va[k^1]=0;go_flow(n+n+2,1+n+i,1);go_flow(1+j,1,1);res--;} va[k^1]=va[k]=0;Road[j][i]=0;cnt[j]++;}}y+=Step;}}res+=go_flow(1,n+n+2);return res>=n;
}
bool judge(db rad){tot=1;res=0;memset(fi,0,sizeof fi);memset(cnt,0,sizeof cnt);fo(i,1,n) Add(1,1+i,1);fo(i,1,n) Add(1+n+i,n+n+2,1);memset(Road,0,sizeof Road);N=0;fo(i,1,n){db Dist=sqrt(a[i].x*a[i].x+a[i].y*a[i].y);if (rad+m<Dist || Dist<m-rad || a[i].x==0 && a[i].y==0 && rad<m) return false;if (rad<m+Dist){db Alpha=atan2(a[i].y,a[i].x),Beta=acos((m*m+Dist*Dist-rad*rad)/(2.0*m*Dist));L[i]=Alpha-Beta;R[i]=Alpha+Beta;if (L[i]<-pi) L[i]+=2*pi;if (R[i]>=pi) R[i]-=2*pi;}else{L[i]=-pi;R[i]=pi;}newQuery(L[i]);newQuery(R[i]);}sort(q+1,q+N+1);if (n<=10){     fo(i,1,N) if ((i==Last || q[i]-q[i-1]>1e-7) && check(q[i])){Last=i;//printf("%d\n",i);return true;}return false;}/*fd(i,N,1) if ((i==N || q[i+1]-q[i]>1e-7) && check(q[i])){printf("%d\n",i);return true;}*/fo(i,Last,N) if ((i==Last || q[i]-q[i-1]>1e-7) && check(q[i])){Last=i;//printf("%d\n",i);return true;}fo(i,1,Last-1) if ((i==1 || q[i]-q[i-1]>1e-7) && check(q[i]+Step)){//Last=i;//printf("%d\n",i);return true;}return false;
}
db Ans;
void Solve(){db l=0,r=200;while (r-l>1e-7){db mid=(l+r)/2;if (judge(mid)) r=mid;else l=mid;}Ans=l;
}void Print(){printf("%.8lf\n",Ans);
}int main(){freopen("3.in","r",stdin);freopen("3.out","w",stdout);Init();Solve();Print();return 0;
}

转载于:https://www.cnblogs.com/hiweibolu/p/9048012.html

【JSOI2018】绝地反击相关推荐

  1. yyb省选前的一些计划

    突然意识到有一些题目的计划,才可以减少大量查水表或者找题目的时间. 所以我决定这样子处理. 按照这个链接慢慢做. 当然不可能只做省选题了. 需要适时候夹杂一些其他的题目. 比如\(agc/arc/cf ...

  2. 【LOJ】#2548. 「JSOI2018」绝地反击

    题解 卡常卡不动,我自闭了,特判交上去过了 事实上90pts= = 我们考虑二分长度,每个点能覆盖圆的是一段圆弧 然后问能不能匹配出一个正多边形来 考虑抖动多边形,多边形的一个端点一定和圆弧重合 如果 ...

  3. [JSOI2018]军训列队

    [JSOI2018]军训列队 题目大意: \(n(n\le5\times10^5)\)个学生排成一排,第\(i\)个学生的位置为\(a_i\).\(m(m\le5\times10^5)\)次命令,每次 ...

  4. 五千万美元注资孵化器,ETC能实现绝地反击吗?

    今日,巴比特获悉,在纽约共识大会Consensus 2018上,由三家投资机构HCM (Foxconn Technology Group,简称HCM).Digital Finance Group(简称 ...

  5. 他总在逆风翻盘,绝地反击!最不爱钱却成了最有钱的人...

    前言 IM Iron Man 还记不记得那年,小罗伯特唐尼一句即兴创作的IM Iron Man,将电影钢铁侠捧上人气巅峰,漫威自此迎来复兴,甩开DC不止一条街的距离. 小罗伯特唐尼扮演的钢铁侠,满足了 ...

  6. P4559 [JSOI2018]列队 主席树

    传送门 文章目录 题意: 思路: 题意: 给你nnn个学生以及其位置,mmm个询问,每次询问[l,r][l,r][l,r]的学生跑到[k,k+r−l][k,k+r-l][k,k+r−l]的位置的最小总 ...

  7. 凡客第二春 垂死挣扎还是绝地反击

    凡客经历了严峻的寒冬,在外界负面舆论的狂轰滥炸之下进行着漫长的内部整顿,如今凡客准备迎接2012的四月春天.陈年3月末就开始为凡客的四月制造悬念,韩寒在4月1日再开微博,陈年与韩寒同时在四月初吸引了舆 ...

  8. 【JSOI2018】潜入行动

    [JSOI2018]潜入行动 树形\(DP\).设\(f_{i,j,0/1,0/1}\)表示以\(i\)为根的子树中,用了\(j\)个监听器,是否放置了监听器,是否被监听的方案数.转移就多讨论几种情况 ...

  9. [bzoj5314][Jsoi2018]潜入行动_树形背包dp

    潜入行动 bzoj-5314 Jsoi-2018 题目大意:题目链接. 注释:略. 想法: 学长给我们除了一套考试题,三个学长一人一道这是T1. 好吧好吧,傻逼背包...... 复杂度$O(nk)$. ...

  10. 【题解】P4516 [JSOI2018] 潜入行动

    [题解]P4516 [JSOI2018] 潜入行动 比较常规但是有点思维含量的一道树形 DP. 题目链接 P4516 [JSOI2018] 潜入行动 题意概述 给定一棵有 \(n\) 个点的树,现在要 ...

最新文章

  1. KDD 2019高维稀疏数据上的深度学习Workshop论文汇总
  2. java springcloud版b2b2c社交电商spring cloud分布式微服务(十三)断路器聚合监控(Hystrix Turbine)...
  3. boost::hana::less用法的测试程序
  4. java多个数据库数据进行访问_通过Spring Boot配置动态数据源访问多个数据库的实现代码...
  5. 基于数据库的分布式锁实现
  6. (转)详解Vs2008下打包安装程序的一些技巧(含win7下提权限、卸载以及安装时定向到网页)...
  7. Java日志性能那些事(转)
  8. win7屏幕录制软件psr.exe使用教程(转)
  9. CCPC-Wannafly Winter Camp Day3 (Div2, onsite) I 石头剪刀布(按秩合并并查集)
  10. .Net MVC控制器中进行页面跳转并传递多个参数
  11. SVN 代码与文件管理小记
  12. 将计算机桌面分,win7电脑屏幕一分为4怎么设置_win7电脑屏幕分成四个区域操作方法...
  13. 机器人多维度高速精密切割加工 引领切割技术升级
  14. 盗墓笔记—阿里旺旺ActiveX控件imageMan.dll栈溢出漏洞研究
  15. 请求接口时常见的数据请求类型
  16. Json Schema 是什么?
  17. 微信分享之分享图片/分享图标不能显示
  18. 不知道如何选用笔记本电脑的快来看看
  19. python面向对象爬取某鱼颜值区主播图片
  20. VS 制作自定义安装程序

热门文章

  1. 抖音主页头图怎么设置,掌握以下5点技巧即可丨国仁网络资讯
  2. Linux 第一次学习笔记
  3. 系统好看 字体font-family
  4. 网页报表等无法打印提示网页上有错误的解决办法
  5. Oracle 在已有表上添加字段
  6. Java图形用户界面实验
  7. ECMAscript6 初涉摘抄笔记
  8. 特教学校计算机课,特教学校引入编程课 为听障孩子打开智能之门
  9. 聚类系数与小世界网络
  10. android文件恢复功能,安卓手机误删文件恢复?快速恢复办法