离散化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. JS操作SELECT方法

    1.判断select选项中 是否存在Value="paraValue"的Item2.向select选项中 加入一个Item3.从select选项中 删除一个Item4.修改sele ...

  2. Bootstrap_排版_表格

    一.基础表格 <table class="table"> <thead> <tr> <th>表格标题</th> < ...

  3. angularjs入门整理

    之前发过一篇博文,从mobile angular ui的demo和其官网初识整个angularjs的大体使用,但是没很好学习,只是通过一些技术博文初步认识,陷入很多坑.所以现在在中文官网正式整理下知识 ...

  4. SNN--Second Name Node

    NameNode有这么几个配置: Property Description Suggested value dfs.name.dir Directory in NameNode’s local fil ...

  5. java 读入换行

    java中实现换行有以下几种方法:1.使用java中的转义符"\r\n": 注意:\r,\n的顺序是不能够对换的,否则不能实现换行的效果. 2.BufferedWriter的new ...

  6. 基于TCP的NAT子网穿透实验

    不得不说,在国内IP紧缺的现状下,NAT发挥了无比巨大的作用:它以把IP和端口重新分配的方式,满足了广大人民群众上网的强烈需求.但是对于个人服务器以及在内网中基于网络的嵌入式设备,却是个比较尴尬的事情 ...

  7. iOS:实现表格填充和选择操作

    功能:创建一个列表,用数组填充表格,并支持选择列表行 // // main.m // Hello // // Created by lishujun on 14-8-28. // Copyright ...

  8. matlab的二维卷积操作

    MATLAB的conv2函数实现步骤(conv2(A,B)): 其中,矩阵A和B的尺寸分别为ma*na即mb*nb ① 对矩阵A补零,第一行之前和最后一行之后都补mb-1行,第一列之前和最后一列之后都 ...

  9. swift中类似宏定义

    建一个类 如,在Contans.swift中 import UIKit let kMAIN_SIZE = UIScreen.mainScreen().bounds 在其他地方直接用 比如在 MyTab ...

  10. Spring MVC 解读——@RequestMapping (1)(转)

    转自:http://my.oschina.net/HeliosFly/blog/212329 Spring MVC 解读——@RequestMapping 为了降低文章篇幅,使得文章更目标化,简洁化, ...