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

1705人阅读 评论(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;
}


个人资料
等级：
访问量： 7万+
积分： 1546
排名： 3万+
爱唱歌的程序员
最新评论