题目大意:
一个$X imes Y(X,Yleq10^5)$的格子中,每秒钟依次$n(nleq10^6)$个蘑菇,
告诉你每个蘑菇出现的时间和位置,问何时第一次出现$k(2leq kleq n)$点共线,且组成的直线平行于坐标轴,或与坐标轴呈45°夹角的情况?
思路:
开4个数组存一下每条符合要求的直线上的点数,
每次$O(1)$算出这个点所属的4条直线,并加入这个点判断是否符合要求即可。
1 #include<cstdio> 2 #include<cctype> 3 inline int getint() { 4 register char ch; 5 while(!isdigit(ch=getchar())); 6 register int x=ch^'0'; 7 while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0'); 8 return x; 9 } 10 const int X=100001; 11 int cnt1[X],cnt2[X],cnt3[X*2],cnt4[X*2]; 12 int main() { 13 const int n=getint(),m=getint(); 14 for(register int i=1;i<=n;i++) { 15 const int x=getint(),y=getint(); 16 if(++cnt1[y]>=m||++cnt2[x]>=m||++cnt3[x-y+X]>=m||++cnt4[x+y]>=m) { 17 printf("%d ",i); 18 return 0; 19 } 20 } 21 puts("-1"); 22 return 0; 23 }