堆箱子.fjx

局部截取_20250714_111610
局部截取_20250714_111629
局部截取_20250714_111645
两个样例过了TLE0分

#include<bits/stdc++.h>
using namespace std;
int i, j, k;
int n, a[100010], b[100010], c[100010];
long long ans;
int main() {
	cin >> n;
	for (i = 1 ; i <= n ; i++) {
		cin >> a[i];
	}
	for (i = 1 ; i <= n ; i++) {
		cin >> b[i];
	}
	for (i = 1 ; i <= n ; i++) {
		cin >> c[i];
	}
	for (i = 1 ; i <= n ; i++) {
		int sum = 0;
		for (j = 1 ; j <= n ; j++) {
			if (a[j] < b[i]) {
				sum++;
			} else {
				break;
			}
		}
		int sum2 = 0;
		for (j = 1 ; j <= n ; j++) {
			if (c[j] > b[i]) {
				sum2++;
			}
		}
		ans += sum * sum2;
	}
	cout << ans << "\n";
	return 0;
}

@李予劼

#include<bits/stdc++.h>
using namespace std;
int a[100005],b[100005],c[100005];
int main() {
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) cin >> a[i];
    for (int i = 0; i < n; i++) cin >> b[i];
    for (int i = 0; i < n; i++) cin >> c[i];
    sort(a, a + n);sort(b, b + n);sort(c, c + n);
    long long ans = 0;
    for (int i = 0; i < n; i++) {
        int cnt1 = //lower_bound从前往后找a中第一个不小于b[i]的值
        int cnt2 = //upper_bound从后往前找c中第一个大于b[i]的值。
        ans += (long long)cnt1 * cnt2;
    }
    cout << ans;
    return 0;
}

(帖子已被作者删除)

不是,这不是伪代码吗?

#include<bits/stdc++.h>
using namespace std;
int a[100005],b[100005],c[100005];
int main() {
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) cin >> a[i];
	for (int i = 1; i <= n; i++) cin >> b[i];
	for (int i = 1; i <= n; i++) cin >> c[i];
	sort(a + 1, a + n + 1);
	sort(b + 1, b + n + 1);
	sort(c + 1, c + n + 1);
	long long ans = 0;
	for (int i = 0; i < n; i++) {
		int cnt1 = lower_bound(a + 1, a + n + 1, b[i]) - (a + 1);
		//lower_bound从前往后找a中第一个不小于b[i]的值
		int cnt2 = upper_bound(c + 1, c + n + 1, b[i]) - (c + 1);
		//upper_bound从后往前找c中第一个大于b[i]的值。
		ans += (long long)cnt1 * cnt2;
	}
	cout << ans;
	return 0;
}

样例没有过

我说了我看错了啊

哦……

cnt2从后往前!!!

#include<bits/stdc++.h>
using namespace std;
int a[100005],b[100005],c[100005];
int main() {
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) cin >> a[i];
	for (int i = 1; i <= n; i++) cin >> b[i];
	for (int i = 1; i <= n; i++) cin >> c[i];
	sort(a + 1, a + n + 1);
	sort(b + 1, b + n + 1);
	sort(c + 1, c + n + 1);
	long long ans = 0;
	for (int i = 0; i < n; i++) {
		int cnt1 = lower_bound(a + 1, a + n + 1, b[i]) - (a + 1);
		//lower_bound从前往后找a中第一个不小于b[i]的值
		int cnt2 = upper_bound(c + n + 1, c + 1, b[i]) - (c + 1);
		//upper_bound从后往前找c中第一个大于b[i]的值。
		ans += (long long)cnt1 * cnt2;
	}
	cout << ans;
	return 0;
}

样例没过

    sort(a + 1, a + n + 1);
	sort(b + 1, b + n + 1);
	sort(c + 1, c + n + 1);

	for(int i = 1; i <= n; i++) {
	    long long cnt_a = lower_bound(a + 1, a + n + 1, b[i]) - a - 1;
	    long long cnt_c = c + n + 1 - upper_bound(c + 1, c + n + 1, b[i]);
    	ans += cnt_a * cnt_c;
	}

c+n+1

我和你思路不一样哎

#include<bits/stdc++.h>
using namespace std;
int a[100005],b[100005],c[100005];
int main() {
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) cin >> a[i];
	for (int i = 1; i <= n; i++) cin >> b[i];
	for (int i = 1; i <= n; i++) cin >> c[i];
	sort(a + 1, a + n + 1);
	sort(b + 1, b + n + 1);
	sort(c + 1, c + n + 1);
	long long ans = 0;
	for (int i = 0; i < n; i++) {
		int cnt1 = lower_bound(a + 1, a + n + 1, b[i]) - (a + 1);
		//lower_bound从前往后找a中第一个不小于b[i]的值
		int cnt2 = upper_bound(c + n + 1, c + 1, b[i]) - (c + n + 1);
		//upper_bound从后往前找c中第一个大于b[i]的值。
		ans += (long long)cnt1 * cnt2;
	}
	cout << ans;
	return 0;
}

样例还是没过

@冯俊骁 你可以试试像我那样改

两个样例都过了

@言过 那样样例也是没过

upper里面别改