hdu5032 点和查询分别按极角排序 离线做+树状数组

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 using namespace std;
 5 struct jie{
 6     double k;
 7     int x,v;
 8 }dian[1000005],xian[100005];
 9 long long c[1005],ans[100005];
10 bool cmp(jie a,jie b)
11 {
12     return a.k<b.k;
13 }
14 long long sum(int x)
15 {
16     long long ret=0;
17     while (x>0) {
18         ret=ret+c[x];
19         x-=(x&-x);
20     }
21     return ret;
22 }
23 void add(int x,int d)
24 {
25     while (x<=1000){
26         c[x]=c[x]+d;
27         x+=(x&-x);
28     }
29 }
30 int main()
31 {
32     int cnt=0,i,j,T,t,n,A,B,x1,y1,x2,p,d;
33     for (i=1;i<=1000;i++)
34         for (j=1;j<=1000;j++)
35     {
36         cnt++;
37         dian[cnt].k=1.0*j/i;
38         dian[cnt].x=i; dian[cnt].v=j;
39     }
40     sort(dian+1,dian+cnt+1,cmp);
41     scanf("%d",&T);
42     for (t=1;t<=T;t++)
43     {
44         memset(c,0,sizeof(c));
45         scanf("%d%d",&A,&B);
46         scanf("%d",&n);
47         for (i=1;i<=n;i++)
48         {
49             scanf("%d%d%d",&x1,&y1,&x2);
50             xian[i].k=1.0*y1/x1;
51             xian[i].x=x2; xian[i].v=i;
52         }
53         sort(xian+1,xian+n+1,cmp);
54         p=1;
55         for (i=1;i<=n;i++)
56         {
57             while (dian[p].k<=xian[i].k&&p<=cnt) {
58                 d=(dian[p].x+A)*(dian[p].v+B);
59                 add(dian[p].x,d);
60                 p++;
61             }
62             ans[xian[i].v]=sum(xian[i].x);
63         }
64         printf("Case #%d:\n",t);
65         for (i=1;i<=n;i++) printf("%I64d\n",ans[i]);
66     }
67 }

http://acm.hdu.edu.cn/showproblem.php?pid=5032

posted on 2014-09-26 18:05  xiao_xin  阅读(122)  评论(0)    收藏  举报

导航