题解:P14319 「ALFR Round 11」C1 开关灯 (switch) (ez ver.)
题意
有
思路
注意到损坏的灯泡每次有概率反转,但反转不会连续进行两次,因此可以分为两种情况讨论。
-
第一次操作损坏的灯泡没有反转,此时
1 \sim n 范围内有n - 1 个灯泡是亮的。 -
第一次操作损坏的灯泡反转了,此时
1 \sim n 范围内有n 个灯泡是亮的。
对于第一种情况,我们对其进行二分,对于每个
对于第二种情况,先将其进行反转,此时由于损坏灯泡不能连续两次反转,
最多操作次数为
代码
#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 now;
cin>>now;
if(now!=n) //损坏灯泡未反转
{
int l=1,r=n,ans=0;
while(l<=r)//二分查询损坏灯泡
{
int mid=l+((r-l)>>1);
cout<<"2 "<<l<<' '<<mid<<endl;
int a;
cin>>a;
if(a!=mid-l+1)
{
ans=mid;
r=mid-1;
}
else
{
l=mid+1;
}
}
cout<<"3 "<<ans<<endl;
}
else //损坏灯泡在第一次操作反转
{
cout<<"1 1 "<<n<<endl;//再次反转,此时只有一个亮的灯泡即为损坏灯泡
int l=1,r=n,ans=0;
while(l<=r)
{
int mid=l+((r-l)>>1);
cout<<"2 "<<l<<' '<<mid<<endl;
int a;
cin>>a;
if(a!=0)
{
ans=mid;
r=mid-1;
}
else
{
l=mid+1;
}
}
cout<<"3 "<<ans<<endl;
}
}
return 0;
}