有n(1≤n≤500000)个学生想交换到其他学校学习。为了简单起见,规定每个想从A学
校换到B学校的学生必须找一个想从B换到A的“搭档”。如果每个人都能找到搭档(一个人不
能当多个人的搭档),学校就会同意他们交换。每个学生用两个整数A、B表示,你的任务
是判断交换是否可以进行。
代码是在vj上抄的一位老哥的
当时看到这个被惊呆了
for(;*s1>='0';x = (x<<3)+(x<<1)+*s1++ - '0')
比较复杂的应该是上面那句 其实也很好理解 转换过来就相当于 x = x*8 + x*2 ;也就是x = x*10 不得不说使用这种方法读入速度确实很快 ,
解题思路就是如果是A 那么++ 如果是 B 那么 -- 如果最后是0的话那么说明 AB 是存在B A想要交换 (仔细的想下就可以的到这个结论)
#include <bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define REP(i,n) for(int i = 0;i<(n);i++)
#define ios1 ios::sync_with_stdio(false)
const int maxd = 500005;
const int inf = 0x3f3f3f3f;
int n,s[maxd];
char d[1<<26],*s1 = d;
inline int f()
{
for(;*s1<'/';s1++)
;
register int x = *s1++-'0';
for(;*s1>='0';x = (x<<3)+(x<<1)+*s1++ - '0')
;
return x;
}
int main(void)
{
freopen("input.in","r",stdin);
fread(d,1,1<<26,stdin);
while(n=f())
{
mem(s,0);
for(int i = 0;i<n;s[f()]++,s[f()]--,++i)
;
int i = 0;
for(;i<maxd;i++){if(s[i]){puts("NO");break;}}
if(i==maxd)puts("YES");
}
return 0;
}