hdu 4742 Pinball Game 3D 分治+树状数组
离散化x然后用树状数组解决,排序y然后分治解决,z在分治的时候排序解决。
具体:先对y排序,solve(l,r)分成solve(l,mid),solve(mid+1,r), 然后因为是按照y排序,所以l,mid区间内的y值都小于mid+1,r。现在再对z排序,按照顺序以x做关键字插入到树状数组中,那么就可以一起解决l,mid对mid+1,r的影响。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=1e5+9,mod=1<<30;
int trsum[maxn],trmax[maxn];
int n;
struct P
{
int x,y,z,id;
}point[maxn],now[maxn];
struct A
{
int max,sum;
}ans[maxn],tr[maxn];
bool cmpx(const P a,const P b)
{
return a.x<b.x;
}
bool cmpy(const P a,const P b)
{
return a.y<b.y;
}
bool cmpz(const P a,const P b)
{
return a.z<b.z;
} int lowbit(int x)
{
return (x&-x);
} void insert(int x,A tmp)
{
for(int i=x;i<=n;i+=lowbit(i))
{
if(tr[i].max==tmp.max)
{
tr[i].sum+=tmp.sum;
tr[i].sum%=mod;
}
else if(tr[i].max<tmp.max)
{
tr[i].sum=tmp.sum;
tr[i].max=tmp.max;
}
}
} A getsum(int x)
{
A ret;
ret.max=-1;
for(int i=x;i>=1;i-=lowbit(i))
{
if(tr[i].max>ret.max)
{
ret.max=tr[i].max;
ret.sum=tr[i].sum;
}
else if(tr[i].max==ret.max)
{
ret.sum+=tr[i].sum;
ret.sum%=mod;
}
}
return ret;
} void clear(int x)
{
for(int i=x;i<=n;i+=lowbit(i))
{
tr[i].max=0;
tr[i].sum=0;
}
} void solve(int l,int r)
{
if(l==r) return ;
int mid=l+r>>1;
solve(l,mid);
for(int i=mid+1;i<=r;i++)
now[i]=point[i];
sort(point+l,point+mid+1,cmpz);
sort(point+mid+1,point+r+1,cmpz);
for(int i=mid+1,top=l;i<=r;i++)
{
while(top<=mid&&point[top].z<=point[i].z)
{
insert(point[top].x,ans[point[top].id]);
top++;
}
A ret=getsum(point[i].x);
ret.max++;
if(ret.max==ans[point[i].id].max)
{
ans[point[i].id].sum+=ret.sum;
ans[point[i].id].sum%=mod;
}
else if(ret.max>ans[point[i].id].max)
{
ans[point[i].id]=ret;
}
}
for(int i=l;i<=mid;i++) clear(point[i].x);
for(int i=mid+1;i<=r;i++)
point[i]=now[i];
solve(mid+1,r);
} int main()
{
// freopen("in.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d %d %d",&point[i].x,&point[i].y,&point[i].z);
point[i].id=i;
}
sort(point+1,point+1+n,cmpx);
for(int i=1,xx=point[1].x-1,num=0;i<=n;i++)
{
if(point[i].x!=xx) num++,xx=point[i].x;
point[i].x=num;
}
sort(point+1,point+1+n,cmpy); for(int i=1;i<=n;i++)
{
ans[i].max=1;
ans[i].sum=1;
}
solve(1,n);
A ret;
ret.max=-1;
for(int i=1;i<=n;i++)
{
if(ret.max==ans[i].max)
{
ret.sum+=ans[i].sum;
ret.sum%=mod;
}
else if(ret.max<ans[i].max)
{
ret=ans[i];
}
}
printf("%d %d\n",ret.max,ret.sum);
}
return 0;
}
hdu 4742 Pinball Game 3D 分治+树状数组的更多相关文章
- 【 HDU - 4456 】Crowd (二维树状数组、cdq分治)
BUPT2017 wintertraining(15) #5A HDU 4456 题意 给你一个n行n列的格子,一开始每个格子值都是0.有M个操作,p=1为第一种操作,给格子(x,y)增加z.p=2为 ...
- hdu 5869 区间不同GCD个数(树状数组)
Different GCD Subarray Query Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K ( ...
- BZOJ_3262_陌上花开_CDQ分治+树状数组
BZOJ_3262_陌上花开_CDQ分治+树状数组 Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),用三个整数表示. 现在要对每朵花评级,一朵花的级别是它拥有的 ...
- 【BZOJ4553】[Tjoi2016&Heoi2016]序列 cdq分治+树状数组
[BZOJ4553][Tjoi2016&Heoi2016]序列 Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能 ...
- BZOJ 1176 Mokia CDQ分治+树状数组
1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 1854 Solved: 821[Submit][St ...
- 【bzoj3262】陌上花开 CDQ分治+树状数组
题目描述 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当且仅当Sa&g ...
- hdu 6203 ping ping ping(LCA+树状数组)
hdu 6203 ping ping ping(LCA+树状数组) 题意:给一棵树,有m条路径,问至少删除多少个点使得这些路径都不连通 \(1 <= n <= 1e4\) \(1 < ...
- 【bzoj2225】[Spoj 2371]Another Longest Increasing CDQ分治+树状数组
题目描述 给定N个数对(xi, yi),求最长上升子序列的长度.上升序列定义为{(xi, yi)}满足对i<j有xi<xj且yi<yj. 样例输入 8 1 3 3 2 1 1 4 5 ...
- BZOJ_2253_[2010 Beijing wc]纸箱堆叠 _CDQ分治+树状数组
BZOJ_2253_[2010 Beijing wc]纸箱堆叠 _CDQ分治+树状数组 Description P 工厂是一个生产纸箱的工厂.纸箱生产线在人工输入三个参数 n p a , , 之后, ...
随机推荐
- nl命令很好,很强大
指令名称: nl - 显示文件的行数及内容 语法: nl [OPTION]... [FILE]... 说明: 将指定文件的内容附加上行数,显示到标准输出. 当没有指定文件名或使用 ...
- phpmailer 发送邮件
<?php /* 可用新浪和网易邮箱测试成功,但QQ不成功! 下载 phpmailer 解压 http://phpmailer.worxware.com/ 要注意邮件服务器的端口号,默认是 25 ...
- js监听鼠标滚动
//加载顺序问题,不可改变位置 var scrollFunc = function(e){ e = e || window.event; if (e.wheelDelta) { i ...
- Cannot open your terminal '/dev/pts/4' - please check.
使用screen命令的时候出现了下面的错误 Cannot open your terminal '/dev/pts/4' - please check. 可以使用script命令来记录这个终端会话, ...
- Xcode6插件开发
工欲善其事必先利其器,Xcode是我们做iOS Dev必须掌握的一款开发工具. Xcode本身也是一门Cocoa程序,与其来说它是一个Cocoa程序,是不是意味着,我们可以去动态去让它做某件事,或者监 ...
- java 转html为pdf
最近有个需求转html为pdf . 用过itext . pd4ml ,都不理想,不是样式有问题,就是页面大小有问题. 或字体有问题. 解决办法是通过wkhtmltopdf工具 , 下载地址为:htt ...
- 十六进制字符串转化为byte数组
工作上有这样的需求之前找了好多都不行,好不容易有个可以的赶紧留下来. 原址:http://blog.163.com/roadwalker@126/blog/static/113561841201013 ...
- iOSシステム構成の纏め
iOSのアーキテクチャ a) iOSのアーキテクチャは階層化されている最上位レベルでは.iOSはそれが稼働しているハードウェアとアプリケーションの間の仲介役を果たします.アプリケーションが ...
- Contest20140711 loop 数论
loop|loop.in|loop.out 题目描述: 有N个点. 现在重复这样的操作: 随机找一个出度为0的点p1,随机找一个入度为0的点p2,连一条有向边从p1指向p2.直到没有出度为0的点. 统 ...
- WebService:设置服务器提供SOAP1.2的服务
1,访问通过cxf发布的服务 (1)与之前一样,同样可以通过在本地通过wsdl文件和命令行生成Java文件来访问服务. 但是我们既然使用了cxf发布,就要通过cxf的工具生成访问.可以通过cxf目录的 ...