CodeForces - 978F Mentors(思维)

题目链接:http://codeforces.com/problemset/problem/978/F

题意:给n个数,k个争吵,求每个数的,在这个数列中有多少比它小且这两个数不争吵。

思路:

先升序排序,再lower_bound一下就知道有多少比它小,k个争吵只记录大数对小数的争吵,这样vector[i].size()就是比他小且争吵的数,那么此数的答案出来了。


代码:

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define EPS 1e-8
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
using namespace std;
typedef long long LL;
typedef pair<int, int> P;
const int maxn = 2e5 + 5;
const int mod = 1e8 + 7;

int n,k;
struct node{
    int v,pos,ans;
}a[maxn];
bool cmp1(node x,node y){
    return x.v<y.v;
}
bool cmp2(node x,node y){
    return x.pos<y.pos;
}
vector<int>q[maxn];
int ef(int x){
    int l=1,r=n;
    while (r>=l){
        int mid=(l+r)/2;
        if (a[mid].v>=x) r=mid-1;
        else l=mid+1;
    }
    return l;
}
int main() {
    while (~scanf ("%d%d",&n,&k)){
        for (int i=1;i<=n;i++){
            scanf ("%d",&a[i].v);
            a[i].pos=i;
            a[i].ans=0;
            q[i].clear();
        }
        for (int i=0;i<k;i++){
            int x,y;
            scanf ("%d%d",&x,&y);
            if (a[x].v>a[y].v) q[x].push_back(y);
            else if (a[x].v<a[y].v) q[y].push_back(x);
        }
        sort(a+1,a+n+1,cmp1);
        for (int i=1;i<=n;i++){
            a[i].ans=ef(a[i].v)-1-q[a[i].pos].size();
        }
        sort(a+1,a+n+1,cmp2);
        for (int i=1;i<=n;i++){
            printf ("%d ",a[i].ans);
        }
        printf ("\n");
    }
    return 0;
}





阅读更多
文章标签: acm
个人分类: 思维
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭