题意

三维严格偏序最长链。(\(n \le 50000\))

分析

按第一维排序然后以第二和第三维作为关键字依次加入一个二维平面,维护前缀矩形最大值。

题解

当然可以树套树....可是似乎没有随机化算法快..

于是我们上加了强剪枝的kdtree....kdtree大法好...

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=50105;
struct node;
int A, P, Te=1, top;
struct ip {
int p[3], d;
node *ptr;
void scan() {
for(int i=0; i<3; ++i) {
Te=(ll)A*Te%P;
p[i]=Te;
}
sort(p, p+3);
swap(p[0], p[1]);
swap(p[1], p[2]);
d=0; ptr=0;
}
}a[N], *b[N];
struct node *null;
struct node {
node *c[2], *f;
int x[2], y[2], mx;
ip *d;
void up() {
x[0]=min(d->p[0], min(c[0]->x[0], c[1]->x[0]));
x[1]=max(d->p[0], max(c[0]->x[1], c[1]->x[1]));
y[0]=min(d->p[1], min(c[0]->y[0], c[1]->y[0]));
y[1]=max(d->p[1], max(c[0]->y[1], c[1]->y[1]));
}
void up2() {
mx=max(d->d, max(c[0]->mx, c[1]->mx));
}
bool check(ip *a, int k) {
return x[k]<a->p[0] && y[k]<a->p[1];
}
bool ok(ip *a) {
return d->p[0]<a->p[0] && d->p[1]<a->p[1];
}
void init(ip *a) {
c[0]=c[1]=null;
x[0]=x[1]=a->p[0];
y[0]=y[1]=a->p[1];
mx=0;
d=a;
}
}Po[N], *iT=Po, *root, *st[N];
node *newnode(ip *a) {
iT->init(a);
return iT++;
}
int nowDep;
bool cmp(const ip *x, const ip *y) {
return x->p[nowDep]==y->p[nowDep]?x->p[nowDep^1]<y->p[nowDep^1]:x->p[nowDep]<y->p[nowDep];
}
void build(int l, int r, node *&x, int dep) {
if(l>r) {
x=null;
return;
}
nowDep=dep;
int mid=(l+r)>>1;
nth_element(b+l, b+mid, b+1+r, cmp);
x=newnode(b[mid]);
b[mid]->ptr=x;
build(l, mid-1, x->c[0], dep^1); if(x->c[0]!=null) x->c[0]->f=x;
build(mid+1, r, x->c[1], dep^1); if(x->c[1]!=null) x->c[1]->f=x;
x->up();
}
int askMx;
void ask(ip *a, node *x) {
if(x==null || !x->check(a, 0) || x->mx<=askMx) {
return;
}
if(x->check(a, 1)) {
askMx=max(askMx, x->mx);
}
if(x->ok(a)) askMx=max(askMx, x->d->d);
ask(a, x->c[0]);
ask(a, x->c[1]);
}
void update(node *x) {
for(x->up2(); x!=root; x=x->f, x->up2());
}
int n;
int main() {
null=iT++;
null->x[0]=null->y[0]=~0u>>1;
null->x[1]=null->y[1]=-(~0u>>1);
null->d=0; null->mx=0;
scanf("%d%d%d", &A, &P, &n);
for(int i=1; i<=n; ++i) {
a[i].scan();
b[i]=&a[i];
}
build(1, n, root, 0);
int ans=0;
nowDep=2;
sort(b+1, b+1+n, cmp);
for(int i=1; i<=n; ++i) {
askMx=0;
ask(b[i], root);
b[i]->d=askMx+1;
st[++top]=b[i]->ptr;
if(i!=n && b[i]->p[2]!=b[i+1]->p[2]) {
while(top) update(st[top--]);
}
ans=max(ans, b[i]->d);
}
printf("%d\n", ans);
return 0;
}

【BZOJ】2253: [2010 Beijing wc]纸箱堆叠的更多相关文章

  1. BZOJ 2253: [2010 Beijing wc]纸箱堆叠

    题目 2253: [2010 Beijing wc]纸箱堆叠 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 239  Solved: 94 Descr ...

  2. BZOJ2253: [2010 Beijing wc]纸箱堆叠

    题解: 其实就是求三维偏序最长链.类似于三维逆序对,我们可以用树状数组套平衡树来实现. DP方程 :f[i]=max(f[j]+1) a[j]<a[i] 我们按一维排序,另一位建立树状数组,把第 ...

  3. 【BZOJ2253】[2010 Beijing wc]纸箱堆叠 cdq分治

    [BZOJ2253][2010 Beijing wc]纸箱堆叠 Description P 工厂是一个生产纸箱的工厂.纸箱生产线在人工输入三个参数 n p a , , 之后,即可自动化生产三边边长为 ...

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

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

  5. BZOJ2253 2010 Beijing wc 纸箱堆叠 CDQ分治

    这题之前度娘上没有CDQ分治做法,gerwYY出来以后写了一个.不过要sort3遍,常数很大. gerw说可以类似划分树的思想优化复杂度,但是蒟蒻目前不会划分树(会了主席树就懒得去弄了). 嗯 将me ...

  6. bzoj 2252 [ 2010 Beijing wc ] 矩阵距离 —— 多源bfs

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2252 又没能自己想出来... 一直在想如何从每个1开始广搜更新答案,再剪剪枝,什么遇到1就不 ...

  7. 【BZOJ】【2253】【WC 2010 BeijingWC】纸箱堆叠

    树套树 Orz zyf 我的树套树不知道为啥一直WA……只好copy了zyf的写法TAT 这题还可以用CDQ分治来做……但是蒟蒻不会…… //y坐标的树状数组是按权值建的……所以需要离散化…… /** ...

  8. 纸箱堆叠 bzoj 2253

    纸箱堆叠 (1s 128MB) box [问题描述] P 工厂是一个生产纸箱的工厂.纸箱生产线在人工输入三个参数 n, p, a 之后,即可自动化生产三边边长为 (a mod P, a^2 mod p ...

  9. 【BZOJ2253】纸箱堆叠 [CDQ分治]

    纸箱堆叠 Time Limit: 30 Sec  Memory Limit: 256 MB[Submit][Status][Discuss] Description P 工厂是一个生产纸箱的工厂. 纸 ...

随机推荐

  1. Dubbo超时和重连机制

    dubbo启动时默认有重试机制和超时机制.超时机制的规则是如果在一定的时间内,provider没有返回,则认为本次调用失败,重试机制在出现调用失败时,会再次调用.如果在配置的调用次数内都失败,则认为此 ...

  2. JavaWeb学习之什么JSP、JSP是如何工作的、JSP语言(各种指令和九大内置对象)、EL表达式简单使用(5)

    1.什么JSP * servlet:java编写的处理动态web的技术 * 特点:Java代码中嵌套html代码 * jsp * 特点:HTMl代码中嵌套java代码 * %tomcat%/conf/ ...

  3. SQLAlchemy ORM高级查询之过滤,排序

    order_by,filter的语法. 用久了才会熟悉. Session = sessionmaker(bind=engine) session = Session() print(session.q ...

  4. git push 使用总结

    git push命令用于将本地分支的更新,推送到远程主机.它的格式与git pull命令相仿. $ git push <远程主机名> <本地分支名>:<远程分支名> ...

  5. 攻城狮在路上(壹) Hibernate(四)--- 对象标识符(OID)生成机制

    Hibernate使用对象标识符(OID)来建立内存中对象和数据库表中记录的对应关系,对象的OID和数据库的主键对应.为了保证OID的唯一性和不可变性,应该让Hibernate来为OID赋值.Hibe ...

  6. bootstrap组件 2

    bootstrap组件2 <!DOCTYPE html> <html lang="zh-cn"> <head > <meta charse ...

  7. hdu 4738 2013杭州赛区网络赛 桥+重边+连通判断 ***

    题意:有n座岛和m条桥,每条桥上有w个兵守着,现在要派不少于守桥的士兵数的人去炸桥,只能炸一条桥,使得这n座岛不连通,求最少要派多少人去. 处理重边 边在遍历的时候,第一个返回的一定是之前去的边,所以 ...

  8. Hbuilder连接模拟器调试

    Hbuilder是一个非常好用的HTML5开发IDE,我最喜欢的功能就是连接手机调试了,连接手机调试有两种途径,一是通过USB连接真机,二是下载安装一个安卓模拟器,让Hbuilder连接到安卓模拟器, ...

  9. 第四篇:SOUI资源文件组织

    什么是资源? 现代的软件只要有UI,基本上少不了资源. 资源是什么?资源就是在程序运行时提供固定的数据源的文件. 在MFC当道的时代,资源一般就是位图(Bitmap),图标(Icon),光标(Curs ...

  10. Android ViewPager使用详解(转)

    这是谷歌官方给我们提供的一个兼容低版本安卓设备的软件包,里面包囊了只有在安卓3.0以上可以使用的api.而viewpager就是其中之一利用它,我们可以做很多事情,从最简单的导航,到页面菜单等等.那如 ...