携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第27天,点击查看活动详情
- 递增三元组
\
给定三个整数数组
A=[A1,A2,…AN]A=[A1,A2,…AN],
B=[B1,B2,…BN]B=[B1,B2,…BN],
C=[C1,C2,…CN]C=[C1,C2,…CN],
请你统计有多少个三元组 (i,j,k)(i,j,k) 满足:
- 1≤i,j,k≤N1≤i,j,k≤N
- Ai<Bj<CkAi<Bj<Ck
输入格式
第一行包含一个整数 NN。
第二行包含 NN 个整数 A1,A2,…ANA1,A2,…AN。
第三行包含 NN 个整数 B1,B2,…BNB1,B2,…BN。
第四行包含 NN 个整数 C1,C2,…CNC1,C2,…CN。
输出格式
一个整数表示答案。
数据范围
1≤N≤1051≤N≤105,
0≤Ai,Bi,Ci≤1050≤Ai,Bi,Ci≤105
输入样例:
3
1 1 1
2 2 2
3 3 3
输出样例:
27
代码:
#include<algorithm>
using namespace std;
typedef long long LL;
const int N = 100010;
int a[N], b[N], c[N];
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, a + n + 1);
sort(b, b + n + 1);
sort(c, c + n + 1);
LL ans = 0;
for (int i = 1; i <= n; i++) {
int l = 1, r = n;
while (l < r) {
int mid = (l + r + 1) / 2;
if (a[mid] < b[i]) l = mid;
else r = mid - 1;
}
int left;
if (a[l] >= b[i]) left = 0;
else left = l;
l = 1, r = n;
while (l < r) {
int mid = (l + r) / 2;
if (c[mid] > b[i]) r = mid;
else l = mid + 1;
}
int right;
if (c[l] <= b[i]) right = n + 1;
else right = l;
ans += (LL)(left) * (n - right + 1);
}
cout << ans;
return 0;
}
- 错误票据
\
某涉密单位下发了某种票据,并要在年终全部收回。
每张票据有唯一的ID号。
全年所有票据的ID号是连续的,但ID的开始数码是随机选定的。
因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成了某个ID断号,另外一个ID重号。
你的任务是通过编程,找出断号的ID和重号的ID。
假设断号不可能发生在最大和最小号。
输入格式
第一行包含整数 NN,表示后面共有 NN 行数据。
接下来 NN 行,每行包含空格分开的若干个(不大于100个)正整数(不大于100000),每个整数代表一个ID号。
输出格式
要求程序输出1行,含两个整数 m,nm,n,用空格分隔。
其中,mm表示断号ID,nn表示重号ID。
数据范围
1≤N≤1001≤N≤100
输入样例:
2
5 6 8 11 9
10 12 9
输出样例:
7 9
代码:
#include<algorithm>
#include <climits>
using namespace std;
int a[100005];
int main(){
int n;
int m;
cin >> n;
int minn = INT_MAX, maxx = 0;
while (cin >> m) {
a[m]++;
maxx = max(m, maxx);
minn = min(m, minn);
}
int ans = 0, res = 0;
for (int i = minn; i <= maxx; i++) {
if (a[i] == 0) ans = i;
if (a[i] == 2) res = i;
}
cout << ans << " " << res;
return 0;
}