Pinball Game 3D

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 688    Accepted Submission(s): 276

Problem Description
RD is a smart boy and excel in pinball game. However, playing common 2D pinball game for a great number of times results in accumulating tedium.




Recently, RD has found a new type of pinball game, a 3D pinball game. The 3D pinball game space can be regarded as a three dimensional coordinate system containing N balls. A ball can be considered as a point. At the beginning, RD made a shot and hit a ball.
The ball hit by RD will move and may hit another ball and the “another ball” may move and hit another another ball, etc. But once a ball hit another ball, it will disappear.



RD is skilled in this kind of game, so he is able to control every ball's moving direction. But there is a limitation: if ball A's coordinate is (x1,y1,z1) and ball B's coordinate is (x2,y2,z2), then A can hit B only if x1 <= x2 and y1 <= y2 and z1 <= z2.



Now, you should help RD to calculate the maximum number of balls that can be hit and the number of different shooting schemes that can achieve that number. Two schemes are different if the sets of hit balls are not the same. The order doesn't matter.
 
Input
The first line contains one integer T indicating the number of cases.

In each case, the first line contains one integer N indicating the number of balls.


The next N lines each contains three non-negative integer (x, y, z), indicating the coordinate of a ball.


The data satisfies T <= 3, N <= 105, 0 <= x, y, z <= 230, no two balls have the same coordinate in one case.
 
Output
Print two integers for each case in a line, indicating the maximum number of balls that can be hit and the number of different shooting schemes. As the number of schemes can be quite large, you should output this number mod 230.
 
Sample Input
2
3
2 0 0
0 1 0
0 1 1
5
3 0 0
0 1 0
0 0 1
0 2 2
3 3 3
 
Sample Output
2 1
3 2
Hint
In the first case, RD can shoot the second ball at first and hit the third ball indirectly.
In the second case, RD can shoot the second or the third ball initially and hit the fourth ball as well as the fifth ball. Two schemes are both the best.
 
Source
 
Recommend
liuyiding   |   We have carefully selected several similar problems for you:  5061 5059 5058 5053 

pid=5052" target="_blank">5052 

 题意:
就是给你n(1e5)个三元组、然后要你求这n个三元组的LIS。和这样LIS的方案数。一个三元祖a比还有一个元祖b大的条件是ax>=bx,ay>=by,az>=bz。
思路:
如果是一维的就非常好做。排个序就完了。两维的话。对x排序。然后dp[i]表示以i结尾最长序列长度.dp[i]=max(dp[i],dp[j]+1)。j<i&&y[j]<y[i]。三维的话就要用到分治的思想了。我们先按x排序x一样按y排。y一样再按x排。这样就能保证dp[i]一定是由1~i-1转移来的。然后我们就能够分治了。

比方我们要算[l,r]的dp值。mid=(L+r)/2如果我们已经算出了[l,mid]的dp值。我们是不是能够用[l,mid]的dp值去更新[mid+1,r]的dp值。

由于dp[i]一定是由1~i-1转移来的所以我们能够建一个树状数组维护z值为zz的最大dp(由于这题每次都是查询[1,x]整个区间所以能够用树状数组来维护最值)。当然z值是离散化后的值。然后我们两边的y排序.然后对于[mid+1,r]的每个dp我们按y值从小到大更新。先把[l,mid]中y值比自己小的插到树状数组中。

然后查询数组数组中z小于自己z的最大dp即可了。这样就能够保证树状数组中的元素x,y都是合理的然后查询的z也是合理的。然后递归处理即可了。先solve(l,mid)然后更新[mid+1,r]再solve(mid+1,r)。

当然递归的时候也能够顺便进行一些排序操作(归并排序)以提高效率。

具体见代码:
#include<algorithm>
#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=100010;
const int mod=1<<30;
typedef long long ll;
struct node
{
int x,y,z;
inline bool operator <(const node& tt) const
{
if(x!=tt.x)
return x<tt.x;
if(y!=tt.y)
return y<tt.y;
return z<tt.z;
}
} po[maxn];
int dp[maxn],sy[maxn],sz[maxn],mv[maxn],ans;
int tmp[maxn<<1],ty[maxn],ptr;
ll num[maxn],nv[maxn],ansn;
bool cmp(int a,int b)//注意y必须这么排.不然可能出现y相等的时候i+1排到i前面的情况.
{
if(po[a].y!=po[b].y)
return po[a].y<po[b].y;
return a<b;
}
void update(int x,int v,ll d,int mn)
{
for(int i=x;i<=mn;i+=i&-i)
{
if(v>mv[i])
mv[i]=v,nv[i]=d;
else if(v==mv[i])
nv[i]+=d;
}
}
int qu(int x,ll &nn)
{
int ret=0;
for(int i=x;i>0;i-=i&-i)
{
if(ret<mv[i])
ret=mv[i],nn=nv[i];
else if(mv[i]==ret)
nn+=nv[i];
}
return ret;
}
void solve(int l,int r)
{
if(l==r)
{
if(dp[l]>ans)
ans=dp[l],ansn=num[l];
else if(dp[l]==ans)
ansn+=num[l];
sz[l]=po[l].z;
return;
}
int mid=(l+r)>>1,le=l,ri=mid+1,len=r-l+1,ml=mid-l+1,lim,h,i;
memmove(tmp+ptr,sy+l,len*sizeof(int));
for(i=0;i<len;i++)
if(tmp[ptr+i]<=mid)//直接把排好的序划分下去即可了。 sy[le++]=tmp[ptr+i];
else
sy[ri++]=tmp[ptr+i];
ptr+=len;
solve(l,mid);
lim=ptr,ptr-=len;
for(i=1;i<=ml;i++)
mv[i]=0;
for(i=ptr;i<lim;i++)
{
if(tmp[i]<=mid)
{
h=lower_bound(sz+l,sz+l+ml,po[tmp[i]].z)-(sz+l)+1;
update(h,dp[tmp[i]],num[tmp[i]],ml);
continue;
}
h=lower_bound(sz+l,sz+l+ml,po[tmp[i]].z)-(sz+l);
if(h>=ml||sz[l+h]>po[tmp[i]].z)
h--;
if(h>=0)
{
ll cc=0;
int tt=qu(h+1,cc)+1;
if(tt>dp[tmp[i]])
dp[tmp[i]]=tt,num[tmp[i]]=cc;
else if(tt==dp[tmp[i]]&&tt!=1)
num[tmp[i]]+=cc;
}
}
solve(mid+1,r);
merge(sz+l,sz+l+ml,sz+l+ml,sz+l+len,ty);
memmove(sz+l,ty,len*sizeof(int));
}
int main()
{
int t,n,i; scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d%d%d",&po[i].x,&po[i].y,&po[i].z);
ansn=ptr=ans=0;
sort(po+1,po+n+1);
for(i=1;i<=n;i++)
sy[i]=i,dp[i]=1,num[i]=1;
sort(sy+1,sy+n+1,cmp);
solve(1,n);
printf("%d %I64d\n",ans,ansn%mod);
}
return 0;
}
/*
送一组数据。网上好多代码都过不了这组。就是由于排序y的时候i+1排到i前面去了。导致少更新非常多
杭电数据比較水就水过去了。 1
17
2 0 0
2 1 1
1 2 1
1 0 0
0 0 1
0 2 0
0 2 2
0 1 1
2 0 1
1 2 2
0 1 0
2 0 2
2 2 2
0 1 2
1 0 2
1 1 1
0 0 2
*/

hdu 4742 Pinball Game 3D(三维LIS&amp;cdq分治&amp;BIT维护最值)的更多相关文章

  1. HDU4742----Pinball Game 3D(三维LIS、CDQ分治)

    题意:三维空间内 n个小球,对应坐标(x,y,z).输出LIS的长度以及方案数. 首先可以先按x排序,先降低一维,然后 剩下y .z,在y上进行CDQ分治,按y的大小用前面的更新后面的.z方向离散化之 ...

  2. HDU-4742 Pinball Game 3D 三维LIS

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4742 题意:求3维的LIS.. 用分治算法搞得,参考了cxlove的题解.. 首先按照x排序,然后每个 ...

  3. hdu 4742 Pinball Game 3D 分治+树状数组

    离散化x然后用树状数组解决,排序y然后分治解决,z在分治的时候排序解决. 具体:先对y排序,solve(l,r)分成solve(l,mid),solve(mid+1,r), 然后因为是按照y排序,所以 ...

  4. cdq分治(hdu 5618 Jam's problem again[陌上花开]、CQOI 2011 动态逆序对、hdu 4742 Pinball Game、hdu 4456 Crowd、[HEOI2016/TJOI2016]序列、[NOI2007]货币兑换 )

    hdu 5618 Jam's problem again #include <bits/stdc++.h> #define MAXN 100010 using namespace std; ...

  5. HDU 4247 Pinball Game 3D(cdq 分治+树状数组+动态规划)

    Pinball Game 3D Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  6. HDU 5618 Jam's problem again(三维偏序,CDQ分治,树状数组,线段树)

    Jam's problem again Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Othe ...

  7. hdu5618 (三维偏序,cdq分治)

    给定空间中的n个点,问每个点有多少个点小于等于自己. 先来分析简单的二维的情况,那么只要将x坐标排序,那么这样的问题就可以划分为两个子问题,,这样的分治有一个特点,即前一个子问题的解决是独立的,而后一 ...

  8. 二维LIS(CDQ分治)

    题目描述 给定一个长度为N的序列S,S的每个元素pi是一个二元组(xi,yi),定义pi<pj当且仅当xi<xj并且yi<yj,求S的最长上升子序列长度 输入格式 第一行一个N,表示 ...

  9. HDU 5618:Jam's problem again(CDQ分治+树状数组处理三维偏序)

    http://acm.hdu.edu.cn/showproblem.php?pid=5618 题意:…… 思路:和NEUOJ那题一样的.重新写了遍理解了一下,算作处理三维偏序的模板了. #includ ...

随机推荐

  1. Android ButterKnife注解框架使用

    这段时间学习了下ButterKnife注解框架,学习的不是特别深入,但是基础也差不多了,在此记录总结一下. ButterKnife是一个Android View注入的库,主要是注解的使用,可以减少很多 ...

  2. debian8上安装pyspider - pyspider中文文档 - pyspider中文网

    debian8上安装pyspider - pyspider中文文档 - pyspider中文网   #apt-get install python python-dev python-distribu ...

  3. ExtJS表格——行号、复选框、选择模型

    本篇的内容是为表格添加行号,和复选框,最后谈一下Ext的选择模型.内容比较简单,就直接上代码了.一. 设置行号   行号的设置主要问题在于删除某一行后需要重新计算行号  Ext.onReady(fun ...

  4. Redmine 邮件配置

    高版本号的Redmine是没有email.yml的.是和configuration.yml合并了.仅仅要配置configuration.yml即可了. 首先得说下Redmine的邮件,配置这个邮件,是 ...

  5. Cocos2d-x3.0 解压zip

    2dx3.0为我们集成了unzip库,帮助我们实现对文件的解压,但使用起来略显复杂我这里封装了一个解压工具库.分享一下. 工具类下载:http://download.csdn.net/detail/q ...

  6. RTL8188EUS带天线的WiFi模块

    http://www.liuliutech.com/ProductShow.asp?ID=121 一,公司介绍瑞昱(REALTEK)半导体成立于1987年,位于台湾[硅谷]的新竹科学园区.凭借着7位创 ...

  7. Mosfet Bi-Directional Switch NMOS PMOS Back to Back

    http://www.electronic-products-design.com/geek-area/electronics/mosfets/using-mosfets-as-general-swi ...

  8. 使MySQL对表名不区分大小写

    今天郁闷死了,在LINUX下调一个程序老说找不到表,但是我明明是建了表的,在MYSQL的命令行下也可以查到,为什么程序就找不到表呢? 后来请教了一个老师才搞定,原来是LINUX下的MYSQL默认是要区 ...

  9. 【mysql】mysql查询 A表B表 1对多 统计A表对应B表中如果有对应,则返回true否则false作为A表查询结果返回

    A表:goods_type B表:brand_config A:B = 1:N 一种商品类型 对应多条 品牌配置 ======================================== 需求 ...

  10. Singleton 单例模式(懒汉方式和饿汉方式)

    单例模式的概念: 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 关键点: 1)一个类只有一个实例       这是最基本 ...