题意
交换生,每个人有起始地和目的地,交换需要满足的条件是如果一个学生要从1交换到2,则必须有另一学生从2交换到1处,才能完成交换
Input
2
1 2
2 1
2
1 2
1 2
0
Output
YES
NO
TLE代码
之前考虑用map< pair< int,int >, int >
键存学生的起始地和目的地,值是学生编号
用迭代器迭代,如果查找到相反匹配的则弹出原来的
最后检查容器是否为空即可
但问题是每次iterator是阶乘的复杂度,结果超时
#include <iostream>
#include <cstdio>
#include <map>
using namespace std;
typedef pair<int,int> ss;
map<int,ss> mrk;
int main()
{
int T, n, a, b;
while( cin >> T && T ){
bool flag = true;
if( T % 2 != 0 ) flag = false;
for( n = 0; n < T; n++ ){
cin >> a >> b;
if( !flag ) continue;
ss p(a,b);
ss f(b,a);
if( !mrk.empty() )
{
bool ff = false;
map<int,ss>::iterator it = mrk.begin();
for( ; it != mrk.end(); it++ ){
if( it->second.first == b && it->second.second == a ){
//cout << "size:" << mrk.size() << endl;
mrk.erase(it);
//cout << "size:" << mrk.size() << endl;
ff = true;
break;
}
}
if(ff) continue;
}
pair<int,ss> pp(n,p);
mrk.insert(pp);
//cout << mrk.size() << endl;
}
if( flag && mrk.size() ) flag = false;
if(flag) cout << "YES" << endl;
else cout << "NO" << endl;
if( !mrk.empty() ) mrk.clear();
}
return 0;
}
AC代码
借鉴思路,存成两个结构体数组,第一个存入a,b,第二个存入b,a
分别sort排序,比较两个结构体数组,如果完全相同则是YES
若遇到不同直接输出NO并break
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
struct stu
{
int a,b;
};
struct stu p[500000+100], s[500000+100], temp;
bool cmp( struct stu x, struct stu y )
{
if(x.a == y.a)
return x.b < y.b;
return x.a < y.a;
}
int main()
{
int T, i;
while( scanf("%d",&T) && T ){
bool flag = true;
for( i = 0; i < T; i++ ){
scanf("%d%d",&p[i].a,&p[i].b);
s[i].b = p[i].a;
s[i].a = p[i].b;
}
sort(p,p+T,cmp);
sort(s,s+T,cmp);
for( i = 0; i < T; i++ ){
if( p[i].a != s[i].a || p[i].b != s[i].b ){
puts("NO");
flag = false;
break;
}
}
if(flag) puts("YES");
}
return 0;
}