跳到主要内容

P14319 「ALFR Round 11」C1 开关灯 (switch) (ez ver.)

· 阅读需 1 分钟
lailai
学生 & 开发者

解题思路

先对整个区间 [1,n][1,n] 进行操作 11(翻转)和操作 22(查询),此时分为两种情况:

  1. 所有灯全亮。
  2. 只有 11 个灯不亮;

对于第一种情况,再次进行全局翻转。

由于坏灯不会连续两次翻转,必定只有 11 个灯亮,这样就转换为类似第二种情况。

此时有且仅有 11 个灯亮或不亮,通过二分查询即可定位。

最多需要 3+log2500=3+9=123+\lceil\log_2 500\rceil=3+9=12 次操作。

参考代码

#include <bits/stdc++.h>
using namespace std;

int main()
{
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
cout<<1<<' '<<1<<' '<<n<<endl;
cout<<2<<' '<<1<<' '<<n<<endl;
int k;
cin>>k;
if(k==n)cout<<1<<' '<<1<<' '<<n<<endl;
int l=1,r=n;
while(l<r)
{
int mid=l+r>>1;
cout<<2<<' '<<l<<' '<<mid<<endl;
int t;
cin>>t;
if(k==n?t>0:t<mid-l+1)r=mid;
else l=mid+1;
}
cout<<3<<' '<<l<<endl;
}
return 0;
}