spoj5464 Counting triangles 和 spoj6408 Counting Triangles 2

spoj5464 Counting triangles 和 spoj6408 Counting Triangles 2

考虑以(x,y)为直角的等腰三角形个数F(x,y),设绕(x,y)逆时针方向的第一个点是(a,b),则另一个点坐标为(x+y-b,y-x+a)
需满足
0<=a<=X
0<=b<=Y
0<=x+y-b<=X
0<=y-x+a<=Y
(a,b)!=(x,y)
此时,F(x,y)=[min{x-y+Y,X}-max{x-y,0}+1]*[min{x+y,Y}-max{x+y-X,0}+1]-1

枚举x,y的值,就得到一个O(n2)的算法,可以AC前面一道了

#include  < iostream >
#include 
< cstdlib >
#include 
< cstdio >

using   namespace  std;

int  main( void )
{
  
int  u,X,Y,x,y,t1,t2;
  
long   long  res;
  scanf(
" %d " , & u);
  
while (u -- )
  {
    scanf(
" %d%d " , & X, & Y);
    res
= 0 ;
    
for (x = 0 ;x <= X;x ++ )
      
for (y = 0 ;y <= Y;y ++ )
      {
        t1
= min(x - y + Y,X) - max(x - y, 0 ) + 1 ;
        t2
= min(x + y,Y) - max(x + y - X, 0 ) + 1 ;
        res
+= t1 * t2 - 1 ;
      }
    printf(
" %lld\n " ,res);
  }
  
return   0 ;
}


但是这样做后面那道题还是会超时,我们需要对公式进行转化,使它能够批量的求出 SF(x,y)的值

未完,待续……

你可能感兴趣的:(spoj5464 Counting triangles 和 spoj6408 Counting Triangles 2)