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;
}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章