JZ Day11 T1 序列

题目大意:

Fiugou想要在一个长度为N的序列A中找到不同位置的三个数,以这三个数为三边长来构成一个三角形。但是它希望在满足条件下,这三个数的位置尽量靠前。具体地,设这三个数的为Ai,Aj,Ak(i<j<k), Fiugou希望k尽量小;当k相等时,满足j尽量小;当k,j均相等时,满足i尽量小。
但是这个序列中的数可能会发生变化。所以Fiugou给出了M个操作,形式如下:
1 x y:将Ax改为y
2:查询最优的合法解,从小到大给出这三个数(而不是位置)。

对于10%的数据, N &lt; = 10 , M &lt; = 5 N&lt;=10, M&lt;=5
对于30%的数据, N &lt; = 100 , M &lt; = 25 N&lt;=100, M&lt;=25
对于50%的数据, N &lt; = 1000 , M &lt; = 1000 N&lt;=1000, M&lt;=1000
对于100%的数据, N &lt; = 100000 , M &lt; = 1000 N&lt;=100000, M&lt;=1000
对于100%的数据, 0 &lt; = A i &lt; = 1 0 9 , 1 &lt; = x &lt; = N , 0 &lt; = y &lt; = 1 0 9 0&lt;=Ai&lt;=10^9, 1&lt;=x&lt;=N, 0&lt;=y&lt;=10^9


解题思路:

暴力枚举
我们发现不满足三角形三边定理的话 a 1 + a 2 a 3 a_1 + a_2 \leq a_3 ,那么最坏情况下就是 a 1 + a 2 = a 3 , a 2 + a 3 = a 4 a_1 + a_2 = a_3,a_2+a_3=a_4 ……这就是斐波那契数列,所以我们每个循环最多只需要枚举50遍,时间复杂度为O(能过) O ( 5 0 3 m ) O(50^3m)


A c c e p t e d   c o d e : Accepted\ code:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define file(x) freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout)

using namespace std;

struct Result {
	int f, s, t;
};

int n, m;
int a[100005];

inline signed read() {
	int f = 0, flag = 1; char c = getchar();
	while (isdigit(c) == 0) flag = (c == '-') ? -1 : 1, c = getchar();
	while (isdigit(c) != 0) f = (f<<1) + (f<<3) + c - 48, c = getchar();
	return flag * f;
}

Result find() {
	for (int i = 3; i <= min(50, n); ++i)
		for (int j = 2; j < i; ++j)
			for (int k = 1; k < j; ++k) {
				int maxa = max(a[k], max(a[i], a[j]));
				int mina = min(a[k], min(a[i], a[j]));
				int mida = maxa == a[k] ? (mina == a[i] ? a[j] : a[i]) : (maxa == a[i] ? max(a[k], a[j]) : (max(a[i], a[k])));
				if (mina + mida > maxa && maxa - mida < mina)
					return (Result){mina, mida, maxa};
			}
	return (Result){-1, -1, -1};
}

int main() {
	n = read();
	for (int i = 1; i <= n; ++i)
		a[i] = read();
	m = read();
	for (int i = 1; i <= m; ++i) {
		if (read() == 2) {
			Result x = find();
			printf("%d %d %d\n", x.f, x.s, x.t);
		} else
			a[read()] = read();
	}
}

猜你喜欢

转载自blog.csdn.net/qq_39798042/article/details/86708584