time limit: 10 sec memory limit: 162 mbsec special judge
submit: 1653 solved: 745
[submit][status][discuss]
計算幾何 vfleaking提供spj
數學問題 計算幾何 旋轉卡殼
按順序列舉凸包上每一條邊為底邊,旋轉卡殼找出此時的矩形的頂點、最左點和最右點,花式計算出邊長,求面積,記錄面積最小值和對應的解。
式子都能看懂,但不看題解就是寫不出來,沮喪。
1/*by silvern
*/2 #include3 #include4 #include5 #include6 #include7 #include8
using
namespace
std;
9const
int inf=0x3f3f3f3f;10
const
double eps=1e-8;11
const
int mxn=100010;12
intread()
15while(ch>='
0' && ch<='9')
16return x*f;17}
18 inline int dt(double
x)22
struct
point;}
25 point operator - (point b);}
26 point operator * (double v);}
27 point operator / (double v);}
28bool
operator
< (point b)const
31 }a[mxn],p[mxn],ans[5
];32
typedef point vector;
33double dot (point a,point b)
34double
cross(point a,point b)
37double
dist(point a,point b)
40double
len(point a)
43double
dlc(point p,point a,point b)
47int
n;48
double ans=0;49
int st[mxn],top=0,t2=0;50
void
andrew()
56 t2=top;
57for(int i=n-1;i;i--)
61if(n>1)t2--;
62 n=t2;
63for(int i=1;i<=n;i++)
66return;67
}68void
solve();//
v逆時針轉90度
89 ans[1]=a[i]+v*dot(a[r]-a[i],v);
90 ans[2]=a[i]+v*dot(a[l]-a[i],v);
91 ans[3]=ans[2]+u*h;
92 ans[4]=ans[1]+u*h;93}
94}95return;96
}97intmain()
104andrew();
105/*
printf("n:%d\n",n);
106for(i=1;i<=n;i++)
*/109
solve();
110int pos=1
;111
for(i=1;i<=4;i++)
116if(ans0
;117 printf("
%.5f\n
",ans);
118for(i=pos;i<=4;i++)
119 printf("
%.5f %.5f\n
",ans[i].x,ans[i].y);
120for(i=1;i)
121 printf("
%.5f %.5f\n
",ans[i].x,ans[i].y);
122return0;
123 }
BZOJ1185 HNOI2007 最小矩形覆蓋
題目描述 給定一些點的座標,要求求能夠覆蓋所有點的最小面積的矩形,輸出所求矩形的面積和四個頂點座標 輸入輸出格式 輸入格式 第一行為乙個整數n 3 n 50000 從第2至第n 1行每行有兩個浮點數,表示乙個頂點的x和y座標,不用科學計數法 輸出格式 第一行為乙個浮點數,表示所求矩形的面積 精確到小...
bzoj1185 HNOI2007 最小矩形覆蓋
time limit 10 sec memory limit 162 mbsec special judge submit 1945 solved 853 submit status discuss 分析 有乙個比較顯然的結論 最小的矩形一定有一條邊在凸包上.利用旋轉卡殼求出對應邊的最遠點.這兩個是...
狡猾的商人 bzoj1202,HNOI2005
ac通道 分析 因為每月的總收入可以為正,也可以為負,所以要比較兩個區間是否相符,當且僅當它們邊界都相同時才能比較。我們設w i 表示第1 i個月的總收入與第1 fa i 1 個月的總收入之差,及第fa i i個月的總收入。如圖。若i 1,j在同乙個集合中,則第i j個月的總收入為w j w i 1...