# HDU 5531 Rebuild ——— 2015ACM-ICPC亚洲区长春站

22 篇文章 0 订阅
38 篇文章 0 订阅

## 原题见HDU 5531

x0+x1=a0x1+x2=a1x2+x3=a2...xn1+x0=an1
x0xi $则x_{0}可以代替所有其他的x_{i}$,如下：
x1=a0x0x2=a1a0+x0x3=a2a1+a0x0...xn1=an1an2+...+(1)(n1)x0
xi=bi+cix0 $令x_{i}=b_{i}+c_{i}*x_{0}$,则
b0=0,c0=1
bi=ai1bi1, ci=ci1

xn1=bn1+cn1x0 $x_{n-1}=b_{n-1}+c_{n-1}*x_{0}$代入到①式，则
(cn1+1)x0=an1bn1

cn1=1x0xi $当c_{n-1}=1时，方程有唯一解x_{0}，只要在代入其他x_{i}过程中不产生负数，即是一组解。否则无解。$
cn1=1an1bn10 $当c_{n-1}=-1时，若a_{n-1}-b_{n-1}不为0，则方程无解。否则有多解。$

x2i=(b2i+2bicix0+c2ix20)=nx20+2(bici)xi+b2i

x0 $x_0$的范围由 xi $x_i$不小于0决定。

## 附code

/*--------------------------------------------
* File Name: HDU 5531
* Author: Danliwoo
* Mail: Danliwoo@outlook.com
* Created Time: 2015-11-01 22:38:00
--------------------------------------------*/

#include <bits/stdc++.h>
using namespace std;
#define LL long long
const double Pi = acos(-1);
int n;
struct point{
LL x, y;
void sc(){
scanf("%I64d%I64d", &x, &y);
}
LL dis(point b){
LL d = (x-b.x)*(x-b.x)+(y-b.y)*(y-b.y);
LL c = sqrt(d);
return c;
}
}p[10010];
LL a[10010], b[10010], c[10010];
double x[10010];
void give(double y)
{
double s = 0;
if(y < 0){
printf("IMPOSSIBLE\n");
return;
}
x[0] = y;
s += pow(x[0], 2);
for(int i = 1;i < n;i++)
{
x[i] = b[i]+c[i]*x[0];
if(x[i] < 0){
printf("IMPOSSIBLE\n");
return;
}
s += pow(x[i],2);
}
s *= Pi;
printf("%.2f\n", s);
for(int i = 0;i < n;i++)
printf("%.2f\n", x[i]);
}
void solve()
{
double L = 0, R = a[0];
for(int i = 2;i < n;i++)
{
if(c[i] == 1)
L = max(L, -1.0*b[i]);
else if(c[i] == -1)
R = min(R, 1.0*b[i]);
if(L > R)
{
printf("IMPOSSIBLE\n");
return;
}
}
double B = 0;
for(int i = 0;i < n;i++)
B += 2*b[i]*c[i];
double m = -B/n/2.0;
if(R < m)
give(R);
else if(L > m)
give(L);
else
give(m);
}
int main()
{
int T;
scanf("%d", &T);
while(T--){
scanf("%d", &n);
for(int i = 0;i < n;i++)
p[i].sc();
for(int i = 0;i < n;i++)
a[i] = p[i].dis(p[(i+1)%n]);
b[0] = 0; c[0] = 1;
for(int i = 1;i < n;i++)
{
c[i] = -c[i-1];
b[i] = a[i-1]-b[i-1];
}
if(c[n-1] == 1)
{
give((a[n-1]-b[n-1])/2.0);
continue;
}
if(b[n-1] != a[n-1])
{
printf("IMPOSSIBLE\n");
continue;
}
solve();
}
return 0;
}

• 0
点赞
• 0
收藏
• 打赏
• 0
评论
11-13 40
11-02 1187
11-12 652
11-01 1076
10-31 848
10-09 465
10-31 66
11-03 348

### “相关推荐”对你有帮助么？

• 非常没帮助
• 没帮助
• 一般
• 有帮助
• 非常有帮助

Danliwoo

¥2 ¥4 ¥6 ¥10 ¥20

1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载，可以购买VIP、C币套餐、付费专栏及课程。