2018 08 03 UPC 个人训练赛

使用 upper 和 lower 函数 来 logn 的 求出在一个排好序的数列中的位置

lower 返回第一个 大于等于 x 的位置

upper返回第一个大于 x 的位置 

就这样

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int a[N],b[N],c[N];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    //for(int i=1;i<=n;i++) scanf("%d",&b[i]);
    //for(int i=1;i<=n;i++) scanf("%d",&c[i]);
    int m;
    while(cin>>m)
    {
        int t = (upper_bound(a+1,a+1+n,m) - a);
        cout<<t<<endl;
    }

    return 0;
}

J题代码

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int a[N],b[N],c[N];
int b1[N],b2[N];
map<int,int> ma;
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++) {
        scanf("%d",&a[i]);
        ma[a[i]]++;
    }
    for(int i=1;i<=n;i++) scanf("%d",&b[i]);
    for(int i=1;i<=n;i++) scanf("%d",&c[i]);
    sort(a+1,a+1+n);
    sort(b+1,b+1+n);
    sort(c+1,c+1+n);
    int t;
    long long ans = 0;
    for(int i=1;i<=n;i++) {
        t = lower_bound(a+1,a+1+n,b[i]) - a;
        b1[i] = t - 1;
        t = upper_bound(c+1,c+1+n,b[i]) - c;
        b2[i] = n + 1 - t;
        ans += 1LL * b1[i] * b2[i];
    }
    printf("%lld\n",ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Hrbust_Final/article/details/81388471