码迷,mamicode.com
首页 > 编程语言 > 详细

hdu 5517 Triple(二维树状数组)

时间:2017-09-13 22:07:38      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:sum   alt   printf   type   blog   分组   题意   pen   names   

题目链接:hdu 5517 Triple

题意:

有n个两元组A,有m个三元组B,然后set C有一个计算方式。

现在让你找set TOP的size。

题解:

理解题意后,显然对于每个b的分组,只有最大的a才有贡献,

然后就可以发现set B中每个元素按照e分组后,只会对应一个a,所以最多有1e5个三元组可能有贡献。

然后将这个三元组排一下序,用二维树状数组搞搞就行了。

技术分享
 1 #include<bits/stdc++.h>
 2 #define F(i,a,b) for(int i=(a);i<=(b);++i)
 3 using namespace std;
 4 typedef long long ll;
 5 
 6 const int N=1e5+7;
 7 int t,n,m,tot,cas,A[N],C[N];
 8 int c[1007][1007];
 9 
10 int sum(int x,int y)
11 {
12     int ret = 0;
13     for(int i = x;i > 0;i -= i&-i)
14         for(int j = y;j > 0;j -= j&-j)
15             ret += c[i][j];
16     return ret;
17 }
18 void add(int x,int y,int val)
19 {
20     for(int i = x;i <= 1003;i += i&-i)
21         for(int j = y;j <= 1003;j += j&-j)
22             c[i][j] += val;
23 }
24 
25 int ask(int x1,int y1,int x2,int y2)
26 {
27     return sum(x2,y2)-sum(x1-1,y2)-sum(x2,y1-1)+sum(x1-1,y1-1);
28 }
29 
30 struct Node
31 {
32     int a,c,d;
33     ll cnt;
34     Node(int _a=0,int _c=0,int _d=0,ll _e=0):a(_a),c(_c),d(_d),cnt(_e){}
35     bool operator <(const Node &BB)const
36     {
37         if(a!=BB.a)return a<BB.a;
38         if(c!=BB.c)return c<BB.c;
39         return d<BB.d;
40     }
41 }have[N];
42 
43 
44 int main(){
45     scanf("%d",&t);
46     while(t--)
47     {
48         F(i,1,100000)A[i]=0;
49         memset(c,0,sizeof(c)),tot=0;
50         scanf("%d%d",&n,&m);
51         int a,b,c;
52         F(i,1,n)
53         {
54             scanf("%d%d",&a,&b);
55             if(a>A[b])A[b]=a,C[b]=0;
56             if(a==A[b])C[b]++;
57         }
58         F(i,1,m)
59         {
60             scanf("%d%d%d",&a,&b,&c);
61             if(A[c])have[++tot]=Node(A[c],a,b,C[c]);
62         }
63         sort(have+1,have+1+tot);
64         int tcnt=1;
65         F(i,2,tot)if(have[i].a==have[tcnt].a&&have[i].c==have[tcnt].c&&have[i].d==have[tcnt].d)
66         {
67             have[tcnt].cnt+=have[i].cnt;
68         }else have[++tcnt]=have[i];
69         ll ans=0;tot=tcnt;
70         for(int i=tot;i;i--)
71         {
72             if(!ask(have[i].c,have[i].d,1000,1000))
73                 ans+=have[i].cnt;
74             add(have[i].c,have[i].d,1);
75         }
76         printf("Case #%d: %lld\n",++cas,ans);
77     }
78     return 0;
79 }
View Code

 

hdu 5517 Triple(二维树状数组)

标签:sum   alt   printf   type   blog   分组   题意   pen   names   

原文地址:http://www.cnblogs.com/bin-gege/p/7517749.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!