acwing

52 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第27天,点击查看活动详情

  1. 递增三元组

\

给定三个整数数组

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. 1≤i,j,k≤N1≤i,j,k≤N
  2. 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;
}
  1. 错误票据

\

某涉密单位下发了某种票据,并要在年终全部收回。

每张票据有唯一的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;

}