5.4 每日一题题解
三角形
涉及知识点:
- 模拟/思维
solution:
-
\(这个题可以暴力也可以巧妙一点的暴力\)
-
\(我看了一下别人的代码,直接暴力就过了,每次询问的时候,找符合条件的最大的三个数\)
-
\(晚上突然想到,根据斐波那契数列数列,不会构造出长度为1e5,而且所有的边都不能构成三角形的样例,所以只要是提前排好序,那么每次找最大值的的时间为O(90),也就是常数\)
-
\(我说一下我的思路:\)
-
\(我是提前把答案预处理出来,就是当我需要删除哪一根木棒的时候,就可以直接输出答案\)
-
\(假设最大的符合条件的三条边是a,b,c那么当我们删除其余任意一条边的时候,答案一定是a + b + c\)
-
\(那么当我们去除a,b,c其中一个木棒的时候,那么我们自己暴力出符合条件的最大值就OK了\)
-
\(注意这个题一定要有long long,注意这个题一定要有long long,注意这个题一定要有long long\)
std:
#include <iostream>
#include <algorithm>
using namespace std;
typedef pair<long long,long long>PII;
long long n,m;
const long long N = 1e5 + 10;
pair<long long,long long> a[N];
long long ans[N];
bool check(long long b,long long c,long long d)
{
if(a[d].first + a[c].first > a[b].first)
{
return true;
}
return false;
}
int main()
{
cin >> n >> m;
for(long long i = 1;i <= n;i ++)
{
scanf("%lld",&a[i].first);
a[i].second = i;
}
sort(a + 1,a + n + 1,[](pair<long long,long long>p1,pair<long long,long long>p2){
return p1.first > p2.first;
});
long long nn = 0;
for(long long i = 1;i <= n - 2;i ++)
{
if(check(i,i + 1,i + 2))
{
nn = i;
break;
}
}
if(nn == 0)
{
while(m --)
{
long long x;
cin >> x;
cout << -1 << endl;
}
return 0;
}
long long res = a[nn].first + a[nn + 1].first + a[nn + 2].first;
for(long long i = 1;i <= n;i ++)
{
if(i == a[nn].second || i == a[nn + 1].second || i == a[nn + 2].second)
{
continue;
}
ans[i] = res;
}
while(m --)
{
long long x;
cin >> x;
if(x == a[nn].second || x == a[nn + 1].second || x == a[nn + 2].second && !ans[x])
{
if(x == a[nn].second)
{
long long aa = -1;
for(long long i = nn + 1;i <= n - 2;i ++)
{
if(check(i,i+1,i+2))
{
aa = a[i].first + a[i + 1].first + a[i + 2].first;
break;
}
}
ans[x] = aa;
cout << ans[x] << endl;
}
else if(x == a[nn + 1].second)
{
long long aa = -1;
if(nn + 3 <= n && check(nn,nn + 2,nn + 3))
{
aa = a[nn].first + a[nn + 2].first + a[nn + 3].first;
}
if(aa == -1)
{
for(long long i = nn + 2;i <= n - 2;i ++)
{
if(check(i,i+1,i+2))
{
aa = a[i].first + a[i + 1].first + a[i + 2].first;
break;
}
}
}
ans[x] = aa;
cout << ans[x] << endl;
}
else
{
long long aa = -1;
if(check(nn,nn + 1,nn + 3) && nn + 3 <= n)
{
aa = a[nn].first + a[nn + 1].first + a[nn + 3].first;
}
if(check(nn + 1,nn + 3,nn + 4) && nn + 4 <= n && aa == -1)
{
aa = a[nn + 1].first + a[nn + 3].first + a[nn + 4].first;
}
if(aa == -1)
{
for(long long i = nn + 3;i <= n - 2;i ++)
{
if(check(i,i+1,i+2))
{
aa = a[i].first + a[i + 1].first + a[i + 2].first;
break;
}
}
}
ans[x] = aa;
cout << ans[x] << endl;
}
}
else
{
cout << ans[x] << endl;
}
}
return 0;
}