前两份代码在洛谷上,后一份为选手提交,提交后所有测试点(最高n⩽2×105,时限均为 1s)均显示 TLE,包括 908ms 的也是这样,但是报错信息不尽相同,即使返回为 ok 的也会报 TLE。
checker.cpp
#include "testlib.h"
#include <iostream>
using namespace std;
int main(int argc,char* argv[])
{
setName("Move pointer");
registerInteraction(argc,argv);
/*
* Sample File Format
1 pro_n pro_g
2 a1 a2 a3 .... an
*/
int pro_n=inf.readInt(),pro_g=inf.readInt(),a[1000005],pro_p=0,pro_d=0,pro_op=0,pro_cnt=0;
double pro_score=1;
for(int i=0;i<pro_n;i++) a[i]=inf.readInt();
cout<<pro_g<<endl;
while(pro_cnt<=200000&&pro_p^pro_g)
{
pro_op=ouf.readInt();
if(pro_op==1)
{
pro_d=ouf.readInt();
pro_p+=pro_d;
pro_p%=pro_n;
pro_p+=pro_p<0?pro_n:0;
cout<<a[pro_p]<<endl;
pro_cnt++;
}
else
{
pro_d=ouf.readInt();
cout<<pro_n<<endl;
pro_score*=0.3;
}
}
if(pro_cnt>3000) pro_score*=0.2;
else if(pro_cnt>300) pro_score*=0.5;
if(pro_cnt>200000) quitf(_wa,"Sliding times limit exceeded.");
else if(pro_score<0.9) quitp(5*pro_score,"Some limit being broken up.");
else quitf(_ok,"Sliding successfully.");
}
interactive_lib.cpp
#include <iostream>
using namespace std;
void work();
void init(int &x)
{
cin>>x;
}
int slide(int x)
{
int y;
cout<<"1 "<<x<<std::endl;
cin>>y;
return y;
}
int cheat()
{
int x;
cout<<"0"<<std::endl;
cin>>x;
return x;
}
int main()
{
work();
return 0;
}
test.cpp
int a[400005],p=0,l,r,mid,n,g;
void init(int &x);
int slide(int x);
int cheat();
void work()
{
init(g);
a[0]=slide(0);
a[1]=slide(1);
while(a[1<<p>>1]<a[1<<p]) p++,a[1<<p]=slide(1<<p>>1);
p=1<<p;l=p>>1;r=p;
while(l+1<r)
{
mid=(l+r)>>1;
a[mid]=slide(mid-p);
if(a[l]>a[mid]) r=p=mid;
else l=p=mid;
}
if(a[l]>a[r]) n=l;
else n=r;
slide(-p);
l=p=0;r=n-1;
while(true)
{
mid=(l+r+1)>>1;
a[mid]=slide(mid-p);
if(a[mid]>g) r=p=mid;
else l=p=mid;
if(a[p]==g) break;
}
}