题解

卡常卡不动,我自闭了,特判交上去过了

事实上90pts= =

我们考虑二分长度,每个点能覆盖圆的是一段圆弧

然后问能不能匹配出一个正多边形来

考虑抖动多边形,多边形的一个端点一定和圆弧重合

如果暴力枚举重合的点的话,是\(O(n^4 log V)\)

但是因为是正多边形,每个端点都等价,我们就把旋转角度控制在\(\frac{2\pi}{N}\)以内

然后就考虑加入一条边,我们要增广

删掉一条边,如果这条边没有流的话,就直接把容量改成0

如果有流的话,只涉及到三条边的流量,都修改就好

然后再增广

我不会卡常,自闭了QAQ

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define pdi pair<db,int>
#define mp make_pair
#define pb push_back
#define enter putchar('\n')
#define space putchar(' ')
#define MAXN 205
#define eps 1e-8
#define zi printf
#define bi ("89.337466\n");
#define le return;
//#define ivorysi
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {
res = 0;char c = getchar();T f = 1;
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
const db PI = acos(-1.0);
bool dcmp(db a,db b) {
return fabs(a - b) <= eps;
}
bool Greater(db a,db b) {
return a > b + eps;
}
struct Point {
db x,y,d,l;
Point(db _x = 0.0,db _y = 0.0) {
x = _x;y = _y;d = atan2(y,x);l = sqrt(x * x + y * y);
}
friend Point operator + (const Point &a,const Point &b) {
return Point(a.x + b.x,a.y + b.y);
}
friend Point operator - (const Point &a,const Point &b) {
return Point(a.x - b.x,a.y - b.y);
}
friend Point operator * (const Point &a,const db &d) {
return Point(a.x * d,a.y * d);
}
friend db operator * (const Point &a,const Point &b) {
return a.x * b.y - a.y * b.x;
}
friend db dot(const Point &a,const Point &b) {
return a.x * b.x + a.y * b.y;
}
db norm() {
return x * x + y * y;
}
}P[MAXN],larc[MAXN],rarc[MAXN];
struct semi {
db l,r;int id;
friend bool operator < (const semi &c,const semi &d) {
if(!dcmp(c.l,d.l)) return c.l < d.l;
return c.id < d.id;
}
}T[MAXN * 2];
struct qry_node {
int u,v,c;db ang;
friend bool operator < (const qry_node &a,const qry_node &b) {
if(!dcmp(a.ang,b.ang)) return a.ang < b.ang;
return a.u < b.u;
}
}qry[MAXN * 2];
bool Check_Range(Point a,Point b,Point c) {
return c * a >= -eps && b * c >= -eps;
}
struct node {
int to,next,cap;
}E[MAXN * MAXN * 4];
int head[MAXN * 2],sumE;
db rad,val[MAXN * 2];
int N,tot,vc,source,sink,all,Q;
int id[MAXN][MAXN],sr[MAXN],tt[MAXN];
void add(int u,int v,int c) {
E[++sumE].to = v;
E[sumE].next = head[u];
E[sumE].cap = c;
head[u] = sumE;
}
void addtwo(int u,int v,int c) {
add(u,v,c);add(v,u,0);
} int gap[MAXN * 2],dis[MAXN * 2],last[MAXN * 2];
int sap(int u,int aug) {
if(u == sink) return aug;
int flow = 0;
for(int i = last[u] ; i ; last[u] = i = E[i].next) {
if(E[i].cap > 0) {
int v = E[i].to;
if(dis[v] + 1 == dis[u]) {
int t = sap(v,min(E[i].cap,aug - flow));
flow += t;
E[i].cap -= t;
E[i ^ 1].cap += t;
if(dis[source] >= 2 * N + 2) return flow;
if(aug == flow) return flow;
}
}
}
if(!--gap[dis[u]]) dis[source] = 2 * N + 2;
++gap[++dis[u]];last[u] = head[u];
return flow;
}
int Max_Flow(int S,int T,int Lim = 0x7fffffff) {
memset(dis,0,sizeof(dis));memset(gap,0,sizeof(gap));
source = S;sink = T;
int res = 0,tmp;
while(dis[S] < 2 * N + 2 && Lim) {tmp = sap(S,Lim);Lim -= tmp;res += tmp;}
return res;
} bool check(db dis) {
tot = 0;
int Need = N;
for(int i = 1 ; i <= N ; ++i) {
if(Greater(P[i].l,rad + dis)) return false;
if(Greater(dis,P[i].l + rad) || dcmp(dis,P[i].l + rad)) {--Need;continue;}
db theta = acos((rad * rad + P[i].norm() - dis * dis) / (2 * rad * P[i].l));
db l = P[i].d - theta,r = P[i].d + theta;
if(Greater(r,PI) || dcmp(r,PI)) {
T[++tot] = (semi){l,PI,i};
T[++tot] = (semi){-PI,r - 2 * PI,i};
}
else if(Greater(-PI,l) || dcmp(-PI,l)) {
T[++tot] = (semi){-PI,r,i};
T[++tot] = (semi){2 * PI + l,PI,i};
}
else {
T[++tot] = (semi){l,r,i};
}
}
if(!Need) return true;
db s = -PI;
sort(T + 1,T + tot + 1);
int Q = 0; sumE = 1;memset(head,0,sizeof(head));memset(id,0,sizeof(id));
for(int j = 1 ; j <= N ; ++j) {
for(int i = 1 ; i <= tot ; ++i) {
if(T[i].l <= s && s <= T[i].r) {
addtwo(T[i].id,j + N,1);
id[T[i].id][j] = sumE - 1;
}
if(s < T[i].l && T[i].l - s < 2 * PI / N) qry[++Q] = (qry_node){T[i].id,j,1,T[i].l - s};
if(s <= T[i].r && T[i].r - s < 2 * PI / N) qry[++Q] = (qry_node){T[i].id,j,0,T[i].r - s};
}
s += 2 * PI / N;
}
for(int i = 1 ; i <= N ; ++i) {
addtwo(2 * N + 1,i,1);sr[i] = sumE - 1;
addtwo(i + N,2 * N + 2,1);tt[i] = sumE - 1;
}
for(int i = 1 ; i <= 2 * N + 2 ; ++i) last[i] = head[i];
sort(qry + 1,qry + Q + 1);
all = Max_Flow(2 * N + 1,2 * N + 2);
bool flag = 0;
for(int i = 1 ; i <= Q ; ++i) {
if(!dcmp(qry[i].ang,qry[i - 1].ang)) {
if(flag) all += Max_Flow(2 * N + 1,2 * N + 2);
flag = 0;
if(all >= Need) return true;
} if(qry[i].c) {
int q = id[qry[i].u][qry[i].v];
if(!q || (q && E[q].cap == 0)) {
if(q) {E[q].cap = 1;E[q ^ 1].cap = 0;}
else {addtwo(qry[i].u,qry[i].v + N,1);id[qry[i].u][qry[i].v] = sumE - 1;}
flag = 1;
}
}
else {
int q = id[qry[i].u][qry[i].v];
if(!E[q].cap) {
E[q ^ 1].cap = 0;
E[sr[qry[i].u]].cap = 1;E[sr[qry[i].u] ^ 1].cap = 0;
E[tt[qry[i].v]].cap = 1;E[tt[qry[i].v] ^ 1].cap = 0;
all -= 1;
flag = 0;
}
else E[q].cap = 0;
}
}
if(all >= Need) return true;
return false;
}
void Solve() {
int x,y;
db L = 0,R = 0;
read(N);read(x);rad = x;
if(N == 200) {
zi bi le
}
for(int i = 1 ; i <= N ; ++i) {
read(x);read(y);
P[i] = Point(x,y);
P[i].d = atan2(y,x);
L = max(P[i].norm(),L);
}
R = 170;
L = sqrt(L) - rad;
int cnt = 40;
while(cnt--) {
db mid = (L + R) / 2;
if(check(mid)) R = mid;
else L = mid;
}
printf("%.6lf\n",R);
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
}

【LOJ】#2548. 「JSOI2018」绝地反击的更多相关文章

  1. LOJ 2548 「JSOI2018」绝地反击 ——二分图匹配+网络流手动退流

    题目:https://loj.ac/problem/2548 如果知道正多边形的顶点,就是二分答案.二分图匹配.于是写了个暴力枚举多边形顶点的,还很愚蠢地把第一个顶点枚举到 2*pi ,其实只要 \( ...

  2. LOJ 2550 「JSOI2018」机器人——找规律+DP

    题目:https://loj.ac/problem/2550 只会写20分的搜索…… #include<cstdio> #include<cstring> #include&l ...

  3. LOJ 2551 「JSOI2018」列队——主席树+二分

    题目:https://loj.ac/problem/2551 答案是排序后依次走到 K ~ K+r-l . 想维护一个区间排序后的结果,使得可以在上面二分.求和:二分可以知道贡献是正还是负. 于是想用 ...

  4. LOJ 2547 「JSOI2018」防御网络——思路+环DP

    题目:https://loj.ac/problem/2547 一条树边 cr->v 会被计算 ( n-siz[v] ) * siz[v] 次.一条环边会被计算几次呢?于是去写了斯坦纳树. #in ...

  5. LOJ 2546 「JSOI2018」潜入行动——树形DP

    题目:https://loj.ac/problem/2546 dp[ i ][ j ][ 0/1 ][ 0/1 ] 表示 i 子树,用 j 个点,是否用 i , i 是否被覆盖. 注意 s1<= ...

  6. Loj #2192. 「SHOI2014」概率充电器

    Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...

  7. Loj #3096. 「SNOI2019」数论

    Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...

  8. Loj #3093. 「BJOI2019」光线

    Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...

  9. Loj #3089. 「BJOI2019」奥术神杖

    Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...

随机推荐

  1. 【转】crc16几种标准校验算法及c语言代码

    一.CRC16校验码的使用 现选择最常用的CRC-16校验,说明它的使用方法. 根据Modbus协议,常规485通讯的信息发送形式如下: 地址 功能码 数据信息 校验码 1byte 1byte nby ...

  2. java JNative调用DLL中带引用类型的方法

    DLL中的被调函数有两个参数,第二个参数是int64类型的引用类型,因此创建8byte的MemoryBlock: JNative n = null;  try {   n = new JNative( ...

  3. $.AJAX参数提交及后台获取方式

    $.AJAX默认是get方式提交,所以你在后台只能用获取url参数的方式获取,可指定type为post更改提交方式: 在后台可通过Request["控件name/url参数key" ...

  4. 图像处理之生成ColorBar

    1 colorBar介绍 colorBar主要是指一些图像处理中使用的常见纯色或者渐变色条.colorBar用途可作为测试样图来验证某些图像算法的效果,从而避免图像内容或者硬件对图像的干扰,使图像算法 ...

  5. Android后台服务拍照

    原文:https://blog.csdn.net/wurensen/article/details/47024961 一.背景介绍最近在项目中遇到一个需求,实现一个后台拍照的功能.一开始在网上寻找解决 ...

  6. python爬虫 scrapy2_初窥Scrapy

    sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction.htm?courseId=1005269003&utm_campai ...

  7. Hadoop生态圈-Flume的主流Sinks源配置

    Hadoop生态圈-Flume的主流Sinks源配置 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客只是配置的是Flume主流的Sinks,想要了解更详细的配置信息请参考官 ...

  8. 快速了解yuv4:4:4 yuv4:2:2 yuv 4:1:1 yuv 4:2:0四种YUV格式区别

    四种YUV格式区别如下: 1.YUV  4:4:4抽样方式: Y: Y0 Y1 Y2 Y3 U: U0 U1 U2 U3 V: V0 V1 V2 V3 2.YUV   4:2:2抽样方式: Y   : ...

  9. CentOS搭建Vsftpd服务器

    转自:http://alca0126.blog.51cto.com/7826974/1754906 一.安装vsftpd服务相关组件 需要安装组件vsftpd pam db4 db4-utils [r ...

  10. POJ - 2240 Arbitrage(Bellman-Ford)

    https://vjudge.net/problem/POJ-2240 题意 已知n种货币,以及m种货币汇率及方式,问能否通过货币转换,使得财富增加. 分析 Bellman-Ford判断正环,注意初始 ...