Atcoder 318 E - Sandwiches

Atcoder 318 E - Sandwiches_第1张图片

Atcoder 318 E - Sandwiches_第2张图片

Atcoder 318 E - Sandwiches_第3张图片

题意:找出有多少组数满足以下条件

大体思路挺简单的,很快就能想到,但是有些细节,等wa过后才知道需要处理。

一开始用的暴力tle了,但是思路可以参考嘛,只要将其优化一下,就正解了

既然 j 要在 (i,k) 区间里,那么每对 Ai = Ak,就能产生 k-i-1组。

但这k-i-1组并不是都能满足条件 Ai != Aj。而如果遍历(i,j)区间找出满足条件的,就太暴力超时了

因此采用这种办法:若当前输入的数字是11,

该11能成组的组数 = (先前出现过11的次数 - 1)* (当前11的下标 - 上一个11的下标 - 1)

因为如果 当前11跟上一个11能成组的数字,这些数字一定也能跟当前11,先前所有出现过的11

例如:

         11 2 3 11 11 4 5 11

下标    1 2 3  4   5 6 7  8

若当前在下标11,下标6,7能和下标5成组,那么一定也能和下标1,4成组

#include
#include
#include
#include
#include 
#include
#include
#include
#include
#include
#include 
#include
#include 

#define inf 0x3f3f3f3f
#define int long long
const int N = 300030;
//#include 
typedef long long ll;
#include
using namespace std;

long long MAX(long long a, long long b) { return a < b ? b : a; }


vector> v(N, vector(1, 0));
//num,n
//v数组存的是index


signed main()
{
	int n;
	cin >> n;

	int ans = 0;
	for (int i = 1; i <= n; i++) {
		int a;
		cin >> a;

		//1 2 1 3 2
		v[a].push_back(i);

		int len = v[a].size();
		if (len >= 3) {
			v[a][0] += (v[a][len - 1] - v[a][len - 2] - 1) * (len - 2);
			ans += v[a][0];
		}
	}


	cout << ans;
	return 0;
}

插入个知识点,如果数据比较大,就不要用stl自带的max了,要自己写一个MAX,否则可能会

 

你可能感兴趣的:(算法,c++,开发语言)