题意不难,思路不难,
只是这样写下来,耗时为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的代码怎么写的。