写在前面:本蒟蒻代码逻辑非常混乱,勿喷QwQ
题目是CF804D Expected diameter of a tree,完整代码在帖子末尾。本题用到了双指针+记忆化。按理说双指针复杂度是O(n),但是当我写:
ll ptr=mx[p2].size()-1;
for(int i=0;i<mx[p1].size();i++){
while(mx[p1][i]+mx[p2][ptr]+1>mxL&&ptr>0)ptr--;
if(mx[p1][i]+mx[p2][ptr]+1>=mxL){
sum+=mxsum[p2][mxsum[p2].size()-1];
if(ptr>0)sum-=mxsum[p2][ptr-1];
sum+=(mx[p2].size()-ptr)*(mx[p1][i]+1LL);
sum+=ptr*mxL;
}else{
sum+=(ptr+1)*mxL;
}
}
CF: TLE on test #15
但是如果我加一句:
if(mx[p1].size()>mx[p2].size())swap(p1,p2);
CF: Accepted
也就是说让 i 在较小的序列移动,让ptr在较大的序列移动,就不超时了?????两者最坏情况下都会移动到末尾吧QwQ