HDU 5517 Triple ACM/ICPC 2015 Shenyang(二维树状数组)
来源:互联网 发布:js 页面加载后 合计 编辑:程序博客网 时间:2024/05/21 15:41
Triple
Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 818 Accepted Submission(s): 297
Problem Description
Given the finite multi-set
For each
As a \textbf{multi-set} of triples, we define the TOP subset (as a multi-set as well) of
You need to compute the size of
Input
The input contains several test cases. The first line of the input is a single integer
Each test case contains three lines. The first line contains two integers
The second line contains
which describe the multi-set
The third line contains
corresponding to the
Output
For each test case, you should output the size of set
Sample Input
25 91 1 2 2 3 3 3 3 4 21 4 1 2 2 1 4 1 1 1 3 2 3 2 2 4 1 2 2 4 3 3 2 3 4 1 33 42 7 2 7 2 71 4 7 2 3 7 3 2 7 4 1 7
Sample Output
Case #1: 5Case #2: 12
Source
2015ACM/ICPC亚洲区沈阳站-重现赛(感谢东北大学)
Recommend
wange2014 | We have carefully selected several similar problems for you: 6193 6192 6191 6190 6189
题目读清楚,脑子不混乱,思路自然就会更清晰……
这题就是给你两个集合A和B。A中每个元素包含两个数字a和b,然后B中每个元素包含三个数字c、d和e。我们规定,如果A中的i元素的b与B中的j元素的e相同,那么把这两个元素合并成<a,c,d>加入C集合中。然后,问C集合中,有多少个元素满足C中不存在某个元素的三个数字都大于等于它且不与其相等。
其实复述的也有点乱,好好理解一下吧……然后初始想法是,显然A中的元素,如果两个元素的b相等,而a一大一小,那么显然小的那个不会对结果产生贡献,因为对于可以与小元素配对的所以B中的元素,大元素同样也可以配对,而此时c、d相同,大元素的a更大,因此小元素没有贡献。如此,我们就可以处理出A中每一个b都只能严格对应一个数字a(可以有多个a)。然后,我们就可以合并出C集合,对于每一个B中的元素<c,d,e>我们通过刚刚那个,可以找到b对应的最大的a,就可以构成<a,c,d>,这里要注意如果有多个a,我们没必要建立多个元素,直接合并为一个并记录下个数。
C集合出来之后,我们就来统计满足条件的元素个数。首先我们对元素按照先a后c再d的顺序排序,然后从大的开始添加。我们在合并的时候保证了a都是只有一个,但是并没有保证c,d只有一个,所以也是先把一样的合并。然后开始添加,由于从大到小添加,所以a一定是不上升的,所以如果某个元素是合法的,那么它的c和d中肯定有一个比其他所有元素大,反过来也就是不存在某个元素,使得该元素的c、d都比他小。这样相当于只有两个关联的参数,于是乎可以把c、d看作横纵坐标,每次我看坐标轴上是否有在他右上方的点,如果没有则满足条件把该点加入。即二维单点更新、区间查询,莫过于二维树状数组了。
直到现在,才知道这道题目居然是用二维树状数组的……再次长见识了……具体见代码:
#include<bits/stdc++.h>#define LL long long#define N 100010using namespace std;struct Cset {int a,c,d;LL t;};struct Bset {int c,d,e;};struct Aset {int a,b;};Bset b[N]; Aset a[N]; Cset c[N];int n,m,h[N],tot; LL t[N];struct twoD_BIT{ int c[1010][1010]; void init() {memset(c,0,sizeof(c));} int lowbit(int x) {return x&-x;} LL getsum(int x,int y) { LL res=0; for(int i=x;i>0;i-=lowbit(i)) for(int j=y;j>0;j-=lowbit(j)) res+=c[i][j]; return res; } void update(int x,int y,int val) { for(int i=x;i<=1000;i+=lowbit(i)) for(int j=y;j<=1000;j+=lowbit(j)) c[i][j]+=val; } int query(int x1,int y1,int x2,int y2) { return getsum(x2,y2)-getsum(x1-1,y2)-getsum(x2,y1-1)+getsum(x1-1,y1-1); }} BIT;bool cmp(Cset a,Cset b){ return a.a==b.a? a.c==b.c?a.d<b.d:a.c<b.c : a.a<b.a;}void init(){ BIT.init(); tot=0; memset(h,0,sizeof(h));}bool operator == (Cset a,Cset b){ return a.c==b.c&&a.a==b.a&&a.d==b.d;}int main(){ int T_T,T; cin>>T_T;T=T_T; while(T_T--) { init(); LL ans=0; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d%d",&a[i].a,&a[i].b); if (h[a[i].b]==a[i].a) t[a[i].b]++; if (h[a[i].b]<a[i].a) h[a[i].b]=a[i].a,t[a[i].b]=1; } for(int i=1;i<=m;i++) { scanf("%d%d%d",&b[i].c,&b[i].d,&b[i].e); if (h[b[i].e]>0) c[++tot]=Cset{h[b[i].e],b[i].c,b[i].d,t[b[i].e]}; } n=1; sort(c+1,c+1+tot,cmp); for(int i=2;i<=tot;i++) if (c[n]==c[i]) c[n].t+=c[i].t; else c[++n]=c[i]; for(int i=n;i>=1;i--) { if (!BIT.query(c[i].c,c[i].d,1000,1000)) ans+=c[i].t; BIT.update(c[i].c,c[i].d,1); } printf("Case #%d: %I64d\n",T-T_T,ans); } return 0;}
- HDU 5517 Triple ACM/ICPC 2015 Shenyang(二维树状数组)
- [HDU 5517][2015ACM/ICPC亚洲区沈阳站] Triple 二维树状数组
- hdu 5517 Triple(二维树状数组)
- hdu 5517 Triple 二维树状数组
- 2015ACM/ICPC亚洲区沈阳站 HDU 5517 Triple (二维线段树)
- HDU 5517 (ACM 2015 沈阳) Triple [树状数组]
- HDU 6203 ping ping ping (LCA + 树状数组, 2017 ACM/ICPC Asia Regional Shenyang Online)
- HDU 5517 Triple (2015沈阳站I题&&二维树状数组)
- HDU 5517 Triple(去重+线段树|二维树状数组)
- HDU 5517 Triple (枚举+二维树状数组解决三维点数)
- 【HDU】5451 Best Solver(2015 ACM/ICPC Shenyang Online)
- 【HDU】5458 Stability(2015 ACM/ICPC Shenyang Online)
- 【HDU】5452 Minimum Cut(2015 ACM/ICPC Shenyang Online)
- 【HDU5892 2016 ACM ICPC Asia Regional Shenyang Online A】【二维树状数组模板 区间修改】nn矩阵内子矩阵中各怪兽数量的奇偶性.cpp
- 2016 ACM/ICPC Reginal Shengyang hdu 5892 -Resident Evil 二维树状数组 + 状态压缩
- 【hdu 5517】【2015ACM/ICPC亚洲区沈阳站】Triple 题意&题解&代码(C++)
- hdu 5451(2015 ACM/ICPC Asia Regional Shenyang Online)
- HDU 5458 Stability (2015 ACM/ICPC Asia Regional Shenyang Online)
- Linux中buffer cache 与 page cache的区别
- C语言解题出现的提示
- C/C++ 指针函数返回值的一些问题
- java面试题-理论
- c程序调用汇编函数
- HDU 5517 Triple ACM/ICPC 2015 Shenyang(二维树状数组)
- DEV控件编辑框录入内容消失的问题
- 序列化二叉树
- 循环语句
- 【codevs 1036】商务旅行
- 可折叠按钮
- 2018计算机推免生东南大学面试笔试回忆录~
- 阿里云Centos下安装JDK+Tomcat+Mysql步骤详解
- mysql 字段类型保存小数和整数