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 , , 之后, ...
随机推荐
- Cloudera Impala 之 ORDER BY without LIMIT currently not supported
ERROR: NotImplementedException: ORDER BY without LIMIT currently not supported impala中order by 需要l ...
- 如何用OS X的Xcode写C语言程序
声明:以下内容非本人原创,转载于别处.拿出来只是分享给FY们,不喜勿喷!原创地址http://blog.yorkxin.org/posts/2009/03/15/fundamental-c-with- ...
- Java操作Oracle数据库以及调用存储过程
操作Oracle数据库 publicclass DBConnection { //jdbc:oracle:thin:@localhost:1521:orcl publicstaticf ...
- bzoj 2631: tree 动态树+常数优化
2631: tree Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 1716 Solved: 576[Submit][Status] Descrip ...
- Spring整合CXF,发布RSETful 风格WebService
原文地址:http://www.cnblogs.com/hoojo/archive/2012/07/23/2605219.html 这篇文章是承接之前CXF整合Spring的这个项目示例的延伸,所以有 ...
- MFC应用程序创建窗口的过程 good
MFC应用程序中处理消息的顺序 1.AfxWndProc() 该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc 2.AfxCallWndProc() 该 ...
- 【HDOJ】1394 Minimum Inversion Number
逆序数的性质.1. 暴力解 #include <stdio.h> #define MAXNUM 5005 int a[MAXNUM]; int main() { int n; int i, ...
- Constructing Roads(SPFA+邻接表)
题目描述 Long long ago, There was a country named X, the country has N cities which are numbered from 1 ...
- Linux Shell编程(11)——退出和退出状态
exit命令一般用于结束一个脚本,就像C语言的exit一样.它也能返回一个值给父进程.每一个命令都能返回一个退出状态(有时也看做返回状态).一个命令执行成功返回0,一个执行不成功的命令则返回一个非零值 ...
- Java Web项目的一般目录结构解析(eclipse)
以上为项目名为TestProject的目录结构截图,下面主要解析WebContent下各个目录的用途: css:存放项目所需要的css文件. images:存放项目所需要的图片文件. js:存放项目所 ...