uva10763 - Foreign Exchange

题意不难,思路不难,

只是这样写下来,耗时为0.428ms。有点耗时。。

思路: 首先按照 original location从小到大排序(为了二分查找)然后依次验证是否存在配对的数据,

这里我用了 二分查找,时间稍微快点。

注意,一个数据只能用一次,用过以后,可以用数组标记下来。

代码如下:

#include <cstdio>
#include <cstdlib>
#include <cstring>
const int M = 500000+10;
int st[M][2], n;
bool vis[M];
int comp(const void *a,const void *b)
{
    int *c = (int*)a, *d = (int*)b;
    return c[0] - d[0];
}
int lower_upper_bound(int cur, int state)
{
    int aim = st[cur][1];
    int mid, left = 0, right = n;
    if(state==-1) while(left<right)
    {
        mid = left + (right-left)/2;
        if(aim<=st[mid][0]) right = mid;
            else left = mid+1;
    }
    if(state==1) while(left<right)
    {
        mid = left + (right-left)/2;
        if(aim<st[mid][0]) right = mid;
            else left = mid+1;
    }
    return left;
}
int is_find(int cur)
{
    int aim = st[cur][0];
    int L = lower_upper_bound(cur, -1), R = lower_upper_bound(cur,1);
    for(int i = L; i <= R; i++) if(st[i][1]==aim&&!vis[i]) { vis[i] = true; return 1;}
    return 0;
}
int main ()
{
    int ok;
    while(scanf("%d",&n), n)
    {
        ok = 1;
        memset(vis,false,sizeof(vis));
        for(int i = 0; i < n; i++) scanf("%d%d",&st[i][0],&st[i][1]);
        if(n%2) {puts("NO"); continue; }
        qsort(st,n,sizeof(st[0]),comp);
        for(int i = 0; i < n; i++)
        {
            if(!vis[i]&&!is_find(i)) {ok = 0; break;}
            vis[i] = true;
        }
        ok?puts("YES"):puts("NO");
    }
    return 0;
}

真的不知道人家跑了0.004s的代码怎么写的。

你可能感兴趣的:(uva10763 - Foreign Exchange)