为什么下面的代码被卡精度了?把int改成double就过了(
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define ll long long
#define ld long double
using namespace std;
int n;
struct point{
int x,y;
point(int _x,int _y){x=_x;y=_y;}
point(){x=y=0;}
point operator -(const point& a){
return point(x-a.x,y-a.y);
}
ll operator &(const point& a){
return (ll)x*(ll)a.y-(ll)a.x*(ll)y;
}
bool operator <(const point& a) const{
if(x!=a.x) return x<a.x;
return y<a.y;
}
}p[100005];
double dis(point a,point b){
return pow((ll)(a.x-b.x)*(ll)(a.x-b.x)+(ll)(a.y-b.y)*(ll)(a.y-b.y),0.5);
}
int stk[100005],top;
bool used[100005];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
double a,b;
scanf("%lf %lf",&a,&b);
p[i]=point(100*a,100*b);
}
sort(p+1,p+n+1);
stk[++top]=1;
for(int i=2;i<=n;i++){
while(top>=2 && ((p[stk[top]]-p[stk[top-1]])&(p[i]-p[stk[top]]))<=0)
used[stk[top--]]=0;
used[i]=1;
stk[++top]=i;
}
int tmp=top;
for(int i=n-1;i>=1;i--){
if(!used[i]){
while(top>tmp && ((p[stk[top]]-p[stk[top-1]])&(p[i]-p[stk[top]]))<=0)
used[stk[top--]]=0;
used[i]=1;
stk[++top]=i;
}
}
double ans=0;
for(int i=2;i<=top;i++){
ans+=dis(p[stk[i]],p[stk[i-1]]);
}
printf("%.2lf\n",ans/100);
return 0;
}