关于此做法时间复杂度的疑问
查看原帖
关于此做法时间复杂度的疑问
655425
SpreadWings楼主2022/11/10 08:48

写在前面:本蒟蒻代码逻辑非常混乱,勿喷QwQ

题目是CF804D Expected diameter of a tree,完整代码在帖子末尾。本题用到了双指针+记忆化。按理说双指针复杂度是O(n)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
也就是说让 ii 在较小的序列移动,让ptrptr在较大的序列移动,就不超时了?????两者最坏情况下都会移动到末尾吧QwQ

2022/11/10 08:48
加载中...