【题解】奇数计数

一开始沉迷与突然奇怪起来的画风,觉得反正n到3*10^{6},直接计数或者往桶里面仍就好啊。后来马老师突然:我发现了华点。。。4MB卡空间,直接否了我一开始的想法,但注意到k=1/2,对于k=1可以直接异或,本来觉得k=1是个特殊情况,但是过一段时间(想了整整1个小时)才发现啊,k=1就像是数学大题里的第一问一样,起的是提醒作用qwq

比较美妙的地方有两个:想到4MB很可能会卡万能头(24OJ留下的深刻阴影);没整幺蛾子乖乖从1-31拆位(上次卡牌选取拆位挂五十分留下的深刻阴影)

#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
int n,k,ans,a[31],flag;
int read()
{
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
signed main()
{
	freopen("sort.in","r",stdin);
	freopen("sort.out","w",stdout); 
	n=read(),k=read();
	if(k==1)
	{
		for(int i=1;i<=n;i++)
		{
			int x=read();
			ans^=x;
		}
		printf("%d",ans);
		return 0;
	}
	for(int i=1;i<=n;i++)
	{
		int x=read();
		for(int j=31;j>=0;j--) if((1<<j)&x) a[j]^=x;
		flag^=x;
	}
	for(int i=31;i>=0;i--)
	{
		if((1<<i)&flag)
		{
			printf("%d %d",flag^a[i],a[i]);
			return 0;
		}
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiyuping24

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值