博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu_4742_Pinball Game 3D(cdq分治+树状数组)
阅读量:4326 次
发布时间:2019-06-06

本文共 1668 字,大约阅读时间需要 5 分钟。

题目链接:

题意:

给你n个点,让你求三维的LIS,并且求出有多少种组合能达到LIS。

题解:

求三维的LIS,典型的三维偏序问题,x排序,解决一维,cdq分治y,解决一维,树状数组维护z,解决一维。

注意,cdq中sort不要调用太多,不然会被卡常。

1 #include
2 #define F(i,a,b) for(int i=a;i<=b;i++) 3 using namespace std; 4 typedef pair
P; 5 6 const int N=1e5+7,mod=1<<30; 7 int t,n,hsh_ed,hsh[N]; 8 P sum[N],dp[N]; 9 10 struct node11 {12 int x,y,z,id;13 bool operator <(const node & b)const{
return x
>1;29 cdq(l,mid);30 F(i,l,r)b[i]=a[i],b[i].x=0;31 sort(b+l,b+1+r);32 F(i,l,r)33 {34 if(b[i].id<=mid)add(b[i].z,dp[b[i].id]);35 else36 {37 P now=ask(b[i].z);38 if(now.first+1>dp[b[i].id].first)dp[b[i].id]=P(now.first+1,now.second);39 else if(now.first+1==dp[b[i].id].first)dp[b[i].id].second+=now.second;40 }41 } 42 F(i,l,r)if(b[i].id<=mid)back(b[i].z);43 cdq(mid+1,r);44 }45 46 int main()47 {48 scanf("%d",&t);49 while(t--)50 {51 scanf("%d",&n),hsh_ed=0;52 F(i,1,n)53 {54 scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);55 hsh[i]=a[i].z;56 }57 sort(a+1,a+1+n);58 sort(hsh+1,hsh+1+n),hsh_ed=unique(hsh+1,hsh+1+n)-hsh;59 F(i,1,n)60 {61 dp[i]=P(1,1),a[i].id=i;62 a[i].z=lower_bound(hsh+1,hsh+1+hsh_ed,a[i].z)-hsh;63 }64 cdq(1,n);65 P ans=P(0,0);66 F(i,1,n)up(ans,dp[i]);67 printf("%d %d\n",ans.first,ans.second%mod);68 }69 return 0;70 }
View Code

 

转载于:https://www.cnblogs.com/bin-gege/p/6090206.html

你可能感兴趣的文章
mysql 日期时间运算函数(转)
查看>>
初识前端作业1
查看>>
ffmpeg格式转换命令
查看>>
万方数据知识平台 TFHpple +Xpath解析
查看>>
Hive实现oracle的Minus函数
查看>>
秒杀多线程第四篇 一个经典的多线程同步问题
查看>>
RocketMQ配置
查看>>
vs code调试console程序报错--preLaunchTask“build”
查看>>
蚂蚁金服井贤栋:用技术联手金融机构,形成服务小微的生态合力
查看>>
端口号大全
查看>>
机器学习基石笔记2——在何时可以使用机器学习(2)
查看>>
POJ 3740 Easy Finding (DLX模板)
查看>>
MySQL 处理重复数据
查看>>
关于typedef的用法总结(转)
查看>>
【strtok()】——分割字符串
查看>>
Linux下安装rabbitmq
查看>>
曹德旺
查看>>
【转】判断点在多边形内(matlab)
查看>>
java基础之集合:List Set Map的概述以及使用场景
查看>>
Python 线程 进程 协程
查看>>