问题陈述询问 i < j < k 的此类子数组的数量,这样任何两个数字的总和应大于或等于子数组中的第三个数:
我做了什么:
我从 i=0 到 n-2 运行了一个循环:我使用的基本逻辑是,如果排序子数组中的前两个元素大于或等于最大值,那么所有对都将大于任何元素。每次获得子数组时,我都会将下一个元素添加到其中并再次设置这三个变量。我正在通过 15/20 TCs,其他人正在获得 TLE:
约束:
1<=n<=10^5
1<=ai<=10^9
for(int i=0;i<n-2;i++)
{
int r=i+2;
vector<int> temp(inp.begin()+i,inp.begin()+r+1);
sort(temp.begin(),temp.end());
max_elem=temp[1];min_elem=temp[0];
int maximum=temp[temp.size()-1];
//cout<<max_elem<<" "<<min_elem<<"\n";
while(r<n && max_elem+min_elem >= maximum)
{
//cout<<max_elem<<" "<<min_elem<<" "<<inp[r]<<"\n";
cnt++;
r++;
if(inp[r]<min_elem) {max_elem=min_elem;min_elem=inp[r];}
else if(inp[r]<max_elem) max_elem=inp[r];
else if(inp[r]>maximum) maximum=inp[r];
}
}
cout<<cnt<<"\n";
样品 TC:
I1 :
5
7 6 5 3 4
O1 :
6
解释:
6个子数组满足条件:(7,6,5),(7,6,5,3),(7,6,5,3,4),( 6,5,3),(6,5,3,4),(5,3,4)。
I2 :
5
1 2 3 5 6
O2 :
3
解释:
(1,2,3),(2,3,5),(3,5,6) --(注意: 1,2,3,5 is'因为 1+2 < 5)