题目大意
给定一个长度为N的序列A中找到不同位置的三个数,以这三个数为三边长来构成一个三角形。
但是它希望在满足条件下,这三个数的位置尽量靠前。具体地,设这三个数的为Ai,Aj,Ak(i<j<k), Fiugou希望k尽量小;当k相等时,满足j尽量小;当k,j均相等时,满足i尽量小。
但是这个序列中的数可能会发生变化。所以Fiugou给出了M个操作,形式如下:
1 x y:将Ax改为y
2:查询最优的合法解,从小到大给出这三个数(而不是位置)。
题目解析
只需要知道对于斐波那契数列前50个数是肯定爆出longint范围了
所以只需要对前50个数进行503的枚举即可
代码
#include<bits/stdc++.h>
#define L long long
using namespace std;
int n,m,x,y,z;
int a[100005];
void fun()
{
for(int k=3;k<=n;k++)
for(int j=2;j<=k-1;j++)
for(int i=1;i<=j-1;i++)
if(max(a[k],max(a[j],a[i]))<a[k]+a[j]+a[i]-max(a[k],max(a[j],a[i])))
{
int s[3]={a[k],a[j],a[i]};
sort(s,s+3);
cout<<s[0]<<" "<<s[1]<<" "<<s[2]<<endl;
return;
}
cout<<"-1 -1 -1"<<endl;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
scanf("%d",&x);
if(x==1)
{
scanf("%d%d",&y,&z);
a[y]=z;
}
if(x==2)
{
fun();
}
}
}