41 02 0
3 04 0
2.00001s512mb
考試的時候只想到了cdq分治...沒想到b的處理方法所以寫了40分的結果拼上去的暴力掛了只剩下3 4的20分了
其實這題cdq分治的確可做
首先題目那個-a是忽悠你的。可以直接去掉
那麼轉移方程就是f[i]=min(f[i],sqrt(f[j]*f[j]+(a[i]-a[j])*(a[i]-a[j]))
我們把a[i]降序排序
然後移項後如果j>k j比k對於i優的話,那麼滿足((f[j]*f[j]+a[j]*a[j])+(f[k]*f[k]+a[k]*a[k]))/(2*(a[j]-a[k]))>a[i]
我們cdq分治處理左右區間。保證轉移右區間的時候左區間已經轉移完畢
然後左區間按照a降序,右區間按照b降序
這樣就可以在列舉到右區間某個數的時候把可行左區間加入佇列
然後對已經加入左區間的斜率二分就可以了
#include#include#include#includeusing namespace std;
struct enemy
x[100001],tx[100001];
int n;
double f[100001];
int q[100001];
inline bool cmp1(enemy x,enemy y)
inline bool cmp2(enemy x,enemy y)
if(r0!=0)
x[i].f=min(x[i].f,sqrt(x[q[r0]].f*x[q[r0]].f+(x[q[r0]].a-x[i].a)*(x[q[r0]].a-x[i].a)));
}cdq(mid+1,rr);
p1=ll;
p2=mid+1;
int p=ll-1;
while(p1<=mid&&p2<=rr)
else
}while(p1<=mid)
while(p2<=rr)
for(i=ll;i<=rr;i++)
x[i]=tx[i];
}}inline void solve2()
int main()
solve2();
return 0;
}
Mybaits更新資料1不可修改為0的問題
遇到一件詭異的事情,修改資料從0到1的時候沒有問題,但是從1到0的時候提示成功了,但是總是沒有效果。分析如下 a.從0到1到2沒有問題,說明 邏輯沒有什麼問題 b.從2到1沒有問題,證明上述觀點沒有問題 c.從1到0沒有效果 並且debug到在儲存資料之前,資料也是沒有問題的 得出結論,最有可能出現...
Object C中的字串物件1 不可變字串
import int main int argc,const char argv else 05.驗證乙個字串是否小於,等於或大於另一字串 compareresult str1 compare str2 if compareresult nsorderedascending else if comp...
關於L1正則在某些點不可導說明
首先乙個函式連續但是不一定可導,判斷乙個函式是否連續是在某個點左極限 右極限 改點的函式值,判斷乙個函式是否可導,左導數等於右導數,關於l1正則在0點不可導怎麼解決這個問題,為什麼在0點 不可以導,這個問題從15年畢業到現在,面試過程也被問了,作為一名面試官也問了別人,看看吧 f x x lim x...