[COCI2015]TRAKTOR

题目大意:
  一个$X\times Y(X,Y\leq10^5)$的格子中,每秒钟依次$n(n\leq10^6)$个蘑菇,
  告诉你每个蘑菇出现的时间和位置,问何时第一次出现$k(2\leq k\leq 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\n",i);
18             return 0;
19         }
20     }
21     puts("-1");
22     return 0;
23 }

 

posted @ 2018-02-06 10:01  skylee03  阅读(105)  评论(0编辑  收藏  举报