T134817 取石子游戏
Code 1
#include<iostream>
#include<cstdio>
#include<algorithm>
#define ULL unsigned long long
using namespace std;
struct node
{
int a,b;
}s[70];
ULL x,t;
bool win;
bool cmp(node x,node y)
{
return x.a<y.a;
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&s[i].a,&s[i].b);
if(s[i].a<s[i].b)s[i].a=s[i].b;
}
sort(s+1,s+1+n,cmp);
x=(~0ull)^1;
for(int i=1,j=1;i<=m;i++)
{
while(j<=n&&i==s[j].a)
{
t|=1ull<<(s[j].b-1);
j++;
}
win=~x&t;
x=(x<<1)|win;
}
win?puts("Win"):puts("Loss");
return 0;
}
Code 2
#include<iostream>
#include<cstdio>
#include<algorithm>
#define ULL unsigned long long
using namespace std;
struct node
{
int a,b;
}s[70];
ULL x,t;
bool win;
bool cmp(node x,node y)
{
return x.a<y.a;
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&s[i].a,&s[i].b);
// if(s[i].a<s[i].b)s[i].a=s[i].b;
}
sort(s+1,s+1+n,cmp);
x=(~0ull)^1;
for(int i=1,j=1;i<=m;i++)
{
while(j<=n&&i==s[j].a)
{
t|=1ull<<(s[j].b-1);
j++;
}
win=~x&t;
x=(x<<1)|win;
}
win?puts("Win"):puts("Loss");
return 0;
}
这两个程序的唯一区别就是:判断 a 和 b 的大小。
但是两个都能 AC,因为如果 $a<b$,当石子数不到 b 的时候 t 在这一位就会变成 1,但这里的 x,这一位就相当于越界了,这种情况下根据初值一定是1,那取反之后就是0,不影响结果。
我一开始就PAC了
因为标程是没有判断的,而生成数据时有 a=0
的情况,因此标程的输出就错了……我就 PAC 了……于是我就把数据改了……