【题解】CF1415D

这个题看着就挺吓人的样子。。。似乎找不太到投机的方法;

那我们先用暴力来求解;

我们知道异或的性质是如果有两个相同的位数一样就是0,假设有连续的三个数a,b,c,我们要达到的目的是要使b,c操作后<a,而abc又是不减的,容易想到如果它们最高位相同(即都是1),那么异或之后b,c合成的数一定最高位变成了0,那就比a小了;

根据这个思路,我们先将数组进行异或前缀和,然后写一个三重循环的暴力,即:对于数组中的每一个数i,枚举i左边的区间进行比较,并更新min值;

	for(int i=2;i<=n;i++)a[i]^=a[i-1];
		for(int i=1;i<=n;i++){
			for(int j=i;j<=n;j++){
				for(int k=j+1;k<=n;k++){
					if((a[j]^a[i-1])>(a[k]^a[j]))
						ans=min(ans,k-i-1);
				}
			}
		}

然后我们会发现这个方法虽然对,但n很大的时候会超时,这时候再次观察数据范围,发现a[i]都是<1e9的,所以差不多只有30个二进制位,而且数列不减,每一位只有0,1那就是60个情况,考虑抽屉原理,所以说n>60的时候就一定会有上文所说的连续三个1的情况出现,这样就说明:n>60的时候,一定有ans=1;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值