luogu

题意

其实就是四维偏序。

sol

第一维排序,然后就只需要写个\(3D-tree\)了。

据说\(kD-tree\)的单次查询复杂度是\(O(n^{1-\frac{1}{k}})\)。所以这里的复杂度是\(O(n^{\frac{5}{3}})\)。

code

#include<cstdio>
#include<algorithm>
using namespace std;
int gi()
{
int x=0,w=1;char ch=getchar();
while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if (ch=='-') w=0,ch=getchar();
while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return w?x:-x;
}
#define ls t[o].ch[0]
#define rs t[o].ch[1]
#define cmin(a,b) (a>b?a=b:a)
#define cmax(a,b) (a<b?a=b:a)
const int N = 5e4+5;
int n,D,root,fa[N],pos[N],lim[2][3],ans,Ans;
struct node{
int d[4],id;
bool operator < (const node &b) const
{return d[D]<b.d[D];}
}a[N];
struct kdtree{int d[3],Min[3],Max[3],ch[2],v,mx;}t[N];
void mt(int x,int y)
{
for (int i=0;i<3;++i)
cmin(t[x].Min[i],t[y].Min[i]),cmax(t[x].Max[i],t[y].Max[i]);
}
int build(int l,int r,int d)
{
D=d;int o=l+r>>1;
nth_element(a+l,a+o,a+r+1);
for (int i=0;i<3;++i)
t[o].d[i]=t[o].Min[i]=t[o].Max[i]=a[o].d[i];
pos[a[o].id]=o;
if (l<o) fa[ls=build(l,o-1,(d+1)%3)]=o,mt(o,ls);
if (o<r) fa[rs=build(o+1,r,(d+1)%3)]=o,mt(o,rs);
return o;
}
bool whole(int o)
{
for (int i=0;i<3;++i)
if (t[o].Min[i]<lim[0][i]||t[o].Max[i]>lim[1][i])
return false;
return true;
}
bool in(int o)
{
for (int i=0;i<3;++i)
if (t[o].d[i]<lim[0][i]||t[o].d[i]>lim[1][i])
return false;
return true;
}
bool empty(int o)
{
for (int i=0;i<3;++i)
if (t[o].Min[i]>lim[1][i]||t[o].Max[i]<lim[0][i])
return true;
return false;
}
void query(int o)
{
if (t[o].mx<=ans) return;
if (whole(o)) {cmax(ans,t[o].mx);return;}
if (empty(o)) return;
if (in(o)) cmax(ans,t[o].v);
if (ls) query(ls);if (rs) query(rs);
}
bool cmp(node i,node j)
{
for (int k=3;~k;--k)
if (i.d[k]^j.d[k])
return i.d[k]<j.d[k];
return i.id<j.id;
}
int main()
{
n=gi();
for (int i=1;i<=n;++i)
{
for (int j=0;j<4;++j) a[i].d[j]=gi();
a[i].id=i;
}
root=build(1,n,0);
sort(a+1,a+n+1,cmp);
for (int i=1;i<=n;++i)
{
for (int j=0;j<3;++j) lim[0][j]=0,lim[1][j]=a[i].d[j];
ans=0;query(root);++ans;cmax(Ans,ans);
t[pos[a[i].id]].v=ans;
for (int p=pos[a[i].id];p;p=fa[p]) cmax(t[p].mx,ans);
}
printf("%d\n",Ans);return 0;
}

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

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

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

  2. [CH弱省胡策R2]TATT

    description 洛谷 data range \[ n\le 5\times 10^4\] solution 这就是四维偏序了... 好象时间复杂度是\(O(n^{\frac{5}{3}})\) ...

  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. echo指令

    1.在Linux中echo命令用来在标准输出上显示一段字符,比如:echo "the echo command test!" 这个就会输出“the echo command tes ...

  2. codeforces 357

    C 题意: ###n个勇士编号1-n,m个回合对战,每个回合由仍留在游戏里的编号Li~Ri的人参加,胜者为Xi,输的人退出游戏. ###求一个a1-an的序列,若ai为胜者,则ai=0,否则ai=打败 ...

  3. 2-Color Dutch National Flag Problem

    2-Color Dutch National Flag Problem 问题 a[0..n-1]中包含红元素或蓝元素;重新放置使得 红元素均在蓝元素之前. 循环不变式 每一次循环,a[0...k-1] ...

  4. struts2——文件下载(简单的功能)

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  5. PAT1036. Boys vs Girls (25)

    #include <iostream> #include <algorithm> #include <vector> using namespace std; st ...

  6. C语言查找算法之顺序查找、二分查找(折半查找)

    C语言查找算法之顺序查找.二分查找(折半查找),最近考试要用到,网上也有很多例子,我觉得还是自己写的看得懂一些. 顺序查找 /*顺序查找 顺序查找是在一个已知无(或有序)序队列中找出与给定关键字相同的 ...

  7. 关于log4j.properties例子:DailyRollingFileAppender

    package com.v512.log4j; import org.apache.log4j.Logger; public class HelloLog4J { // 构造记录器,形参是记录器所在的 ...

  8. ReactiveX/RxJava文档中文版

    项目地址:https://github.com/mcxiaoke/RxDocs,欢迎Star和帮忙改进. 有任何意见或建议,到这里提出 Create New Issue 阅读地址 ReactiveX文 ...

  9. C++(十八) — 内存模式、堆和栈

    1.内存模式 一个程序执行时,先复制到内存,然后CPU逐句读取指令执行. 每个存储单元存放一个字节(8bit)数据,每个有一个唯一的地址,地址是顺序编码的.比如:一台计算机256MB内存,则有256* ...

  10. 转:大数据时代快速SQL引擎-Impala

    本文来自:http://blog.csdn.net/yu616568/article/details/52431835 如有侵权 可立即删除 背景 随着大数据时代的到来,Hadoop在过去几年以接近统 ...