有关小埋的“水”题

小埋的三明治序列

WA代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int ans,n;
vector<int> q[300001];
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		int a;
		cin>>a;
		q[a].push_back(i);
		int cnt=q[a].size()-1;
		if(cnt>=2){
			q[a][0]+=(cnt-1)*(q[a][cnt]-q[a][cnt-1]-1);
			ans+=q[a][0];
		}
    }cout<<ans;         
	return 0;
}

核心代码:

sort(q.begin(), q.end());
	for (int i = 0; i < n; i++) {
		int res = 0, ans = 0, j = i + 1; //res: 当前的值 ans: 相同数中间的个数 
		for (; j < n; j++) {
			if (q[j].first == q[j - 1].first) {
				ans++;
				res += ans * (q[j].second - q[j - 1].second - 1);
				sum += res;
			} else break;
		}
		i = j - 1;
	}

我是想你帮我看看,ok?

我觉得是vector有问题

来 题解 AC了给解决法案捏(喜

#include<iostream>
#include<vector>
#include<map>

using namespace std;

int main() {
    int n;
    cin >> n;
    vector<int> A(n);
    for(int i = 0; i < n; i++) {
        cin >> A[i];
    }

    int count = 0;
    for(int i = 0; i < n - 2; i++) {
        for(int j = i + 1; j < n - 1; j++) {
            for(int k = j + 1; k < n; k++) {
                if(A[i] == A[k] && A[i] != A[j]) {
                    count++;
                }
            }
        }
    }

    cout << count << endl;

    return 0;
}

解释:

  1. Input Reading:代码首先读取数组的长度(n),然后读取数组的元素(A)。

  2. 三重循环:为了满足条件(1 \leq i < j < k \leq N),使用了三个嵌套循环:

*最外层的循环从(i = 0)到(i = n - 3)。

*中间循环从(j = i + 1)运行到(j = n - 2)。

*最内层循环从(k = j + 1)运行到(k = n - 1)。

  1. 条件检查:对于(i, j, k)的每个组合,它检查是否(A[i] == A[k])和(A[i] \neq A[j])。

  2. Count:如果满足条件,则增加计数。

  3. 输出:最后,输出计数。

由于三个嵌套循环,该解决方案的时间复杂度为(O(n^3))。这对于小数组是可以接受的,但是对于较大的数组可能效率不高。如果关注效率,则可能需要探索更优化的方法,例如散列或使用额外的数据结构来降低复杂性。

你觉得我会信?如果暴搜A了我就不会来问了(后面的不会)


你自己看看

有没有人帮我调一下?
@金彦劭 这题里没有可以用pair的呀

核心代码:

for(int i=1;i<=n;i++)
	{
		for(int j=1;j<v[i].size();j++)
		{
			ans+=(v[i][j]-v[i][j-1]-1)*j*(v[i].size()-j);//公式!!!!(我之前就错在公式上)
		}
	}
3 个赞

哦哦哦 我再看看

2 个赞