description

洛谷

data range

\[n\le 5\times 10^4
\]

solution

这就是四维偏序了...

好象时间复杂度是\(O(n^{\frac{5}{3}})\)...

因为可以剪枝所以速度快了一些...

code

#include<bits/stdc++.h>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<iomanip>
#include<cstring>
#include<complex>
#include<vector>
#include<cstdio>
#include<string>
#include<bitset>
#include<ctime>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define FILE "a"
#define Cpy(x,y) (memcpy(x,y,sizeof(x)))
#define Set(x,y) (memset(x,y,sizeof(x)))
#define mp make_pair
#define pb push_back
#define RG register
#define il inline
using namespace std;
typedef unsigned long long ull;
typedef pair<int,int> PI;
typedef vector<int>VI;
typedef long long ll;
typedef double dd;
const dd eps=1e-10;
const int mod=1e9+7;
const int N=200010;
const int M=205;
const dd pi=acos(-1);
const int inf=2147483647;
const ll INF=1e18+1;
const ll P=100000;
il int read(){
RG int data=0,w=1;RG char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(ch<='9'&&ch>='0')data=(data<<3)+(data<<1)+(ch^48),ch=getchar();
return data*w;
} il void file(){
srand(time(NULL)+rand());
freopen(FILE".in","r",stdin);
freopen(FILE".out","w",stdout);
} int n,rt,tot,cd,nxt[]={1,2,0};
struct node{int d[4];}p[N];
bool operator <(node x,node y){
if(x.d[0]!=y.d[0])return x.d[0]<y.d[0];
if(x.d[1]!=y.d[1])return x.d[1]<y.d[1];
if(x.d[2]!=y.d[2])return x.d[2]<y.d[2];
if(x.d[3]!=y.d[3])return x.d[3]<y.d[3];
return 0;
}
struct kdnode{int d[3],l[3],r[3],s[2],v,mx;}t[N];
bool operator <(kdnode x,kdnode y){return x.d[cd]<y.d[cd];} #define ls (t[i].s[0])
#define rs (t[i].s[1])
#define mid ((l+r)>>1)
int l[3],r[3],ans;
il void update(int i){
for(RG int k=0;k<3;k++){
t[i].l[k]=t[i].r[k]=t[i].d[k];
if(ls){
t[i].l[k]=min(t[i].l[k],t[ls].l[k]);
t[i].r[k]=max(t[i].r[k],t[ls].r[k]);
}
if(rs){
t[i].l[k]=min(t[i].l[k],t[rs].l[k]);
t[i].r[k]=max(t[i].r[k],t[rs].r[k]);
}
}
t[i].mx=max(t[i].v,max(t[ls].mx,t[rs].mx));
} int rebuild(int l,int r,int D){
if(l>r)return 0;
cd=D;nth_element(t+l,t+mid,t+r+1);
t[mid].s[0]=rebuild(l,mid-1,nxt[D]);
t[mid].s[1]=rebuild(mid+1,r,nxt[D]);
update(mid);return mid;
} void insert(int &i,int D){
if(!i){
i=++tot;Cpy(t[i].d,r);Cpy(t[i].l,r);Cpy(t[i].r,r);
}
if(t[i].d[0]==r[0]&&t[i].d[1]==r[1]&&t[i].d[2]==r[2]){
t[i].v=max(t[i].v,ans);t[i].mx=max(t[i].mx,t[i].v);return;
}
insert(t[i].s[r[D]>t[i].d[D]],nxt[D]);update(i);
} #define ckm(dd) (l[dd]<=t[i].l[dd]&&t[i].r[dd]<=r[dd])
#define ckd(dd) (l[dd]<=t[i].d[dd]&&t[i].d[dd]<=r[dd])
#define cke(dd) (r[dd]<t[i].l[dd]||t[i].r[dd]<l[dd])
void query(int i,int D){
if(!i||cke(2)||cke(1)||cke(0)||t[i].mx<=ans)return;
if(ckm(2)&&ckm(1)&&ckm(0)){ans=max(ans,t[i].mx);return;}
if(ckd(2)&&ckd(1)&&ckd(0))ans=max(ans,t[i].v);
query(ls,nxt[D]);query(rs,nxt[D]);
} int main()
{
n=read();
for(RG int i=1;i<=n;i++)for(RG int k=0;k<4;k++)p[i].d[k]=read();
sort(p+1,p+n+1);
for(RG int i=1;i<=n;i++){
for(RG int k=0;k<3;k++)r[k]=p[i].d[k+1];
ans=0;query(rt,0);ans++;
insert(rt,0);
if(i%10000==0)rt=rebuild(1,tot,0);
}
printf("%d\n",t[rt].mx);
return 0;
}

[CH弱省胡策R2]TATT的更多相关文章

  1. luoguP3769 [CH弱省胡策R2]TATT

    luoguP3769 [CH弱省胡策R2]TATT PS:做这题前先切掉 P4148简单题,对于本人这样的juruo更助于理解,当然dalao就当练练手吧 题目大意: 现在有n个四维空间中的点,请求出 ...

  2. [Luogu3769][CH弱省胡策R2]TATT

    luogu 题意 其实就是四维偏序. sol 第一维排序,然后就只需要写个\(3D-tree\)了. 据说\(kD-tree\)的单次查询复杂度是\(O(n^{1-\frac{1}{k}})\).所以 ...

  3. 【题解】[CH弱省胡策R2]TATT

    本蒟蒻第一道\(K-D-Tree\)维护\(dp\) Question 题目大意:求一条路径,使得其四个维度单调不降. 先排序消掉一维再说. 对于每一个点,初始的时候绝对长度是1啊.于是,先赋值一个1 ...

  4. 洛谷3769[CH弱省胡策R2]TATT (KDTree)(四维LIS)

    真是一个自闭的题目(调了一个上午+大半个下午) 从\(WA\)到\(WA+TLE\)到\(TLE\)到\(AC\) 真的艰辛. 首先,这个题,我们可以考虑直接上四维KDTree来解决. 对于kdtre ...

  5. 【弱省胡策】Round #5 Count

    [弱省胡策]Round #5 Count 太神仙了. \(DP\)做法 设\(f_{n,m,d,k}\)表示\(n*m\)的矩阵,填入第\(k\)个颜色,并且第\(k\)个颜色最少的一列上有\(d\) ...

  6. 弱省胡策 Magic

    弱省胡策 Magic 求\(n\)个点\(n\)的条边的简单联通图的个数. 毒瘤,还要写高精. 我们枚举环的大小\(k\),\(\displaystyle ans=\sum_{k=3}^nC_n^k ...

  7. 【ContestHunter】【弱省胡策】【Round0】(A)&【Round1】(B)

    DP+容斥原理or补集转化?/KD-Tree 唔……突然发现最早打的两场(打的最烂的两场)没有写记录……(太烂所以不忍记录了吗... 还是把搞出来了的两道题记录一下吧= =勉强算弥补一下缺憾…… Ro ...

  8. 【ContestHunter】【弱省胡策】【Round3】(C)

    容斥原理+Fib Orz HE的神犇们 蒟蒻只能改出来第三题……实在太弱 官方题解:http://pan.baidu.com/s/1o6MdtQq fib的神奇性质……还有解密a[i]的过程……这里就 ...

  9. 【ContestHunter】【弱省胡策】【Round2】

    官方题解:http://wyfcyx.is-programmer.com/posts/95490.html A 目前只会30分的暴力……DP好像很神的样子0.0(听说可以多次随机强行算? //Roun ...

随机推荐

  1. DSP5509开发之FPGA接口

    1. DSP5509和FPGA或者CPLD之间是什么接口,DSP相对普通MCU,具有专门的硬件乘法器,程序和数据分开的哈弗结构,特殊的DSP指令,快速的实现各种数字信号处理算法.在一个周期内可以完成一 ...

  2. MySQL - 问题集 - Access denied; you need the SUPER privilege for

    当执行存储过程相关操作时,如果出现该错误,则往下看. 打开存储过程,会发现“CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost`”. 由于DEFI ...

  3. HIS 与医保系统的接入方案及实现

    HIS 与医保系统的接入方案及实现刘剑锋 李刚荣第三军医大学西南医院信息科(重庆 400038)摘要: 目的 建设HIS,迎接医疗改革的挑战.方法 分析HIS与地方医疗保险系统的不同特点,提出解决问题 ...

  4. 根据wsdl生成服务端代码

    场景描述 最近在和一家公司做业务接口对接,由他们那边回调我们这边,对方直接扔过来一个webservice的wsdl文件,让我们按照他们的规范来做webservice服务, 大多数的对接应该是我们创建完 ...

  5. linux 安装 node.js

    wget http://nodejs.org/dist/v0.10.26/node-v0.10.26.tar.gztar zxvf node-v0.10.26.tar.gzcd node-v0.10. ...

  6. OpenCV 3.0.0处理鱼眼镜头信息 - Fisheye camera model

    此篇随笔主要参考OpenCV 3.0.0的官方文档翻译而来,主要用作理解OpenCV对鱼眼相机的标定.图像校正.3D重建功能的理解. 版权所有,转载请注明出处~ xzrch@2018.09.29 参考 ...

  7. Git 简易食用指南 v2.0

    写在前面 一开始我们先聊一聊版本控制,什么是版本控制呢?版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统.具体大类分为: 本地版本控制系统 集中式版本控制系统SVN 分布式 ...

  8. Centos7添加静态路由

    本文摘取自 Centos7系统配置上的变化(二)网络管理基础 一.ip route显示和设定路由 1.显示路由表 [root@centos7 ~]# ip route show default via ...

  9. 关于mysql开元数据库的几个随想

    现在已经是凌晨了,昨天晚上写了我人生中的第一篇笔记,觉得没什么可写的,写了一个多小时都没写出什么,现在突然想写点东西了,这是一个比较有趣的问题,前两个月换了新工作,记得当初面试这份工作的时候面试到第三 ...

  10. 四、oracle 用户管理二

    一.使用profile管理用户口令概述:profile是口令限制,资源限制的命令集合,当建立数据库时,oracle会自动建立名称为default的profile.当建立用户没有指定profile选项时 ...