离散化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 分治+树状数组的更多相关文章

  1. 【 HDU - 4456 】Crowd (二维树状数组、cdq分治)

    BUPT2017 wintertraining(15) #5A HDU 4456 题意 给你一个n行n列的格子,一开始每个格子值都是0.有M个操作,p=1为第一种操作,给格子(x,y)增加z.p=2为 ...

  2. hdu 5869 区间不同GCD个数(树状数组)

    Different GCD Subarray Query Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K ( ...

  3. BZOJ_3262_陌上花开_CDQ分治+树状数组

    BZOJ_3262_陌上花开_CDQ分治+树状数组 Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),用三个整数表示. 现在要对每朵花评级,一朵花的级别是它拥有的 ...

  4. 【BZOJ4553】[Tjoi2016&Heoi2016]序列 cdq分治+树状数组

    [BZOJ4553][Tjoi2016&Heoi2016]序列 Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能 ...

  5. BZOJ 1176 Mokia CDQ分治+树状数组

    1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 1854  Solved: 821[Submit][St ...

  6. 【bzoj3262】陌上花开 CDQ分治+树状数组

    题目描述 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当且仅当Sa&g ...

  7. hdu 6203 ping ping ping(LCA+树状数组)

    hdu 6203 ping ping ping(LCA+树状数组) 题意:给一棵树,有m条路径,问至少删除多少个点使得这些路径都不连通 \(1 <= n <= 1e4\) \(1 < ...

  8. 【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 ...

  9. BZOJ_2253_[2010 Beijing wc]纸箱堆叠 _CDQ分治+树状数组

    BZOJ_2253_[2010 Beijing wc]纸箱堆叠 _CDQ分治+树状数组 Description P 工厂是一个生产纸箱的工厂.纸箱生产线在人工输入三个参数 n p a , , 之后, ...

随机推荐

  1. Python 基础-python环境变量、模块初识及字符类型

    (1).模块内置模块.第三方模块.自定义模块初识模块:sys \ os一般标准库存放路径 C:\Users\Administrator\AppData\Local\Programs\Python\Py ...

  2. js中对象调用对象中的方法

    var o = {a:"abc", b:{ c:function(param){ alert(this.a); //这里的this指向的不是o而是b,所以this是没有a属性的,这 ...

  3. ligerUI路径问题

    ligerUI放mv的Content目录下,路径为固定的并且必须引进一下文件 <link href="~/Content/Ligerui/Source/lib/ligerUI/skin ...

  4. OpenCV for c++Builder

    整理日: 20154/6 Borland C++BuilderでOpenCVを使う 確認 Turbo C++ 2007/03 1. ダウンロード&インストール http://sourcefor ...

  5. MEMS Gyroscope Technology

    InvenSense®Technology Overview Our technology is comprised of five coreelements: our patented Nasiri ...

  6. Light OJ 1051 - Good or Bad

    题目大意: 给你一个字符串,字符串由大写字母和‘?’组成,大写字母可以变成任意一个字母.现在我们定义字符串, 如果有超过三个连续的元音字母或者连续五个辅音字母,那么我们称这个字符串是“BAD”,否则称 ...

  7. Light OJ 1033 - Generating Palindromes(区间DP)

    题目大意: 给你一个字符串,问最少增加几个字符使得这个字符串变为回文串.   ============================================================= ...

  8. Windows 8 关闭无线后无法打开WIFI的解决办法

    转:http://blog.sina.com.cn/s/blog_49d02ed101016b4n.html 在使用 Windows 8 的过程中,遇到过几次使用键盘上的功能键(笔者笔记本上的快捷键是 ...

  9. Xmanager连接CentOS的远程桌面

    本文主要介绍通过Xmanager连接CentOS远程桌面时,在CentOS系统上需要做的一些配置. 1. Xmanager简介 Xmanager是一个运行于 Windows平台上的高性能的X Serv ...

  10. Unity3d 使用DX11的曲面细分

    Unity3d surface Shaderswith DX11 Tessellation Unity3d surface shader 在DX11上的曲面细分 I write this articl ...