您的位置:首页 > 其它

hdu 5032 树状数组+极角排序

2015-03-05 21:24 225 查看
裸题

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#define MAX 1007
#define eps 1e-8

using namespace std;

typedef long long LL;

int t,A,B,m;

struct Point 
{
    int x,y;
    LL ans;
    double angle;
}p[MAX*MAX],q[MAX*MAX];

bool cmp1 ( Point a , Point b )
{
    return a.angle < b.angle;
}

bool cmp2 ( Point a , Point b )
{
    return a.y < b.y;
}

LL c[MAX];

int lowbit ( int x )
{
    return x&-x;
}

void add ( int x , LL v )
{
    while ( x <= 1000  )
    {
        c[x] += v ;
        x += lowbit ( x );
    }
}

LL sum ( int x )
{
    LL ret = 0;
    while ( x )
    {
        ret += c[x];
        x -= lowbit ( x );
    }
    return ret;
}

int main ( )
{
    scanf ( "%d" , &t );
    int cc = 1;
    int cnt = 0;
    for ( int i = 1 ; i <= 1000 ; i++ )
        for ( int j = 1 ; j <= 1000 ; j++ )
        {
            p[cnt].x = i , p[cnt].y = j;
            p[cnt++].angle = j*1.0/(i*1.0);
        }
    sort ( p , p + cnt , cmp1 );
    while ( t-- )
    {
        memset ( c , 0 , sizeof ( c ) );
        scanf ( "%d%d" , &A , &B );
        scanf ( "%d" , &m );
        for ( int i = 0 ; i < m ; i++ )
        {
            int a , b;
            scanf ( "%d%d%d" , &a , &b , &q[i].x );
            q[i].y = i;
            q[i].angle = b*1.0/(a*1.0);
        }
        sort ( q , q + m , cmp1 );
        int num = 0;
        for ( int i = 0 ; i < m ; i++ )
        {
            while ( num!= cnt )
            {
                if ( p[num].angle > q[i].angle  ) break;
                add ( p[num].x , ((LL)( p[num].x + A )) * ((LL) ( p[num].y + B )) ); 
                num++;
            }
            q[i].ans = sum ( q[i].x );
        }   
        sort ( q , q + m , cmp2 );
        printf ( "Case #%d:\n" , cc++ );
        for ( int i = 0 ; i < m ; i++ )
            printf ( "%I64d\n" , q[i].ans );
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: