理论上,在判断可删图形时有两种方法(以下凸包为例),一种是 slope(Q[tail-1],Q[tail])<=slope(Q[tail],i),另一种是 slope(Q[tail-1],Q[tail])<=slope(Q[tail-1],i), 都表示出现了可以删去点 Q[tail] 的情况 (只要对边界、去重的处理足够严谨,两种写法是没有区别的)。
但是在此题中:
while(head<tail && (__int128)(Y(Q[tail])-Y(Q[tail-1]))*(X(i)-X(Q[tail-1])) >= (__int128)(Y(i)-Y(Q[tail-1]))*(X(Q[tail])-X(Q[tail-1]))) tail--;
不加 __int128 只能得 90pts。
而:
while(head<tail && (Y(Q[tail])-Y(Q[tail-1]))*(X(i)-X(Q[tail])) >= (Y(i)-Y(Q[tail]))*(X(Q[tail])-X(Q[tail-1]))) tail--;
不加 __int128 就可以得 100pts。
在此警示后人用交叉相乘比较斜率时当心爆 long long!!!鬼知道我疑惑了多久...