交换学生(Foreign Exchange, UVa 10763)

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值