这题之前度娘上没有CDQ分治做法,gerwYY出来以后写了一个。不过要sort3遍,常数很大。

gerw说可以类似划分树的思想优化复杂度,但是蒟蒻目前不会划分树(会了主席树就懒得去弄了)。

嗯 将memset改成手动clear会快很多。

还有就是第一维相同的情况,划分为两个不存在第一维相同的两个区间即可。

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
const int Maxn= + ;
int C[Maxn*],ans=,A,P,n=,h[Maxn],tot=;
struct Node{
int a,b,c,ans;
void init(int x,int y,int z){
if(x>y)swap(x,y);
if(x>z)swap(x,z);
if(y>z)swap(y,z);
a=x,b=y,h[++tot]=c=z;
ans=;
}
}p[Maxn],q[Maxn];
inline void Add(int x,const int&y){
for(;<x&&x<=n;x+=x&-x)C[x]=max(C[x],y);
}
inline void HashIt(int&x){
x=lower_bound(h+,h+n+,x)-h;
}
inline int Query(int x){
int ret=;
for(;<x&&x<=n;x-=x&-x)ret=max(ret,C[x]);
return ret;
}
inline void Clear(int x) {
for(;x<=n;x+=x&-x)C[x]=;
}
inline bool cmpa(const Node&x,const Node&y){
if(x.a!=y.a)return x.a<y.a;
if(x.b!=y.b)return x.b<y.b;
return x.c<y.c;
}
inline bool cmpb(const Node&x,const Node&y){
if(x.b!=y.b)return x.b<y.b;
return x.c<y.c;
}
void init(){
scanf("%d%d%d",&A,&P,&n);
for(int a,b,c,t=,i=;i<=n;i++){
a=(t=(long long)A*t%P);
b=(t=(long long)A*t%P);
c=(t=(long long)A*t%P);
p[i].init(a,b,c);
}
sort(p+,p+n+,cmpa);
sort(h+,h+n+);
for(int i=;i<=n;i++)HashIt(p[i].c);
} void CDQ(int l,int r){
if(l==r)return;
int mid=-,L=(l+r)>>,R=L+;
while(l<=L || R<=r){
if(l<=L && p[L].a!=p[L+].a){mid=L;break;}
if(R<=r && p[R].a!=p[R-].a){mid=R-;break;}
L--,R++;
}
if(mid==-)return;
CDQ(l,mid);
sort(p+l,p+mid+,cmpb);
sort(p+mid+,p+r+,cmpb);
int i=l;
for(int j=mid+;j<=r;j++){
for(;i<=mid && p[i].b<p[j].b;i++)Add(p[i].c,p[i].ans);
p[j].ans=max(p[j].ans,Query(p[j].c-)+);
}
for(int j=l;j<=i;j++)Clear(p[j].c);
sort(p+mid+,p+r+,cmpa);
CDQ(mid+,r);
}
int main(){
init();
CDQ(,n);
for(int i=;i<=n;i++)
if(p[i].ans>ans)ans=p[i].ans;
printf("%d\n",ans);
return ;
}

BZOJ2253 2010 Beijing wc 纸箱堆叠 CDQ分治的更多相关文章

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

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

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

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

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

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

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

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

  5. 【BZOJ】2253: [2010 Beijing wc]纸箱堆叠

    题意 三维严格偏序最长链.(\(n \le 50000\)) 分析 按第一维排序然后以第二和第三维作为关键字依次加入一个二维平面,维护前缀矩形最大值. 题解 当然可以树套树....可是似乎没有随机化算 ...

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

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

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

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

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

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

  9. cdq分治(偏序)

    偏序问题: https://www.luogu.org/blog/Owencodeisking/post-xue-xi-bi-ji-cdq-fen-zhi-hu-zheng-ti-er-fen 优质题 ...

随机推荐

  1. wel

    欢迎来到mathant.com 这个网站是什么 这个网站是我搭建在阿里云vps上的个人网站.目前的用途是充当个人博客和云存储,当然它的功能不止如此.我会在以后的日子里完善他,希望他能变得更好.目前我在 ...

  2. php 连接mysql数据库并显示数据 实例 转载

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  3. umask默认权限分配

    umask默认权限分配的命令 当我们登录系统之后创建一个文件总是有一个默认权限的,那么这个权限是怎么来的呢?这就是umask干的事情.umask设置了用户创建文件的默认 权限,它与chmod的效果刚好 ...

  4. codeblocks调试(转载)

    单步调试  1)设置断点  在需要设置断点处,右击左边行号,Add breakpoint,则出现一个红色的点(可以同时设置多个,前提是不能在debug的运行模式下). 2)调试运行 Debug-> ...

  5. [转] 属性选择器.mark

    CSS 2 引入了属性选择器. 属性选择器可以根据元素的属性及属性值来选择元素. 简单属性选择 如果希望选择有某个属性的元素,而不论属性值是什么,可以使用简单属性选择器. 例子 1 如果您希望把包含标 ...

  6. php5下载,apache2.4与php5整合

    step1 php5下载 百度“php下载”,找到php官网 2. 点进去,选择windows downloads 3. 同样,X86对应32位,X64对应64位,Non Thread Safe是非线 ...

  7. 精通 Oracle+Python,第 4 部分:事务和大型对象

    通过 Python 管理数据事务.处理大型对象 2010 年 3 月发布 事务包含一组 SQL 语句,这组 SQL 语句构成数据库中的一个逻辑操作,如转帐或信用卡支付操作.将 SQL 语句聚合到一个逻 ...

  8. JavaScriptCore-b

    JavaScriptCore提供了JavaScript和Objective-C桥接的Obj-C API.JavaScriptCore提供了让我们脱离UIWebView执行JavaScript脚本的能力 ...

  9. CTSC模拟题 树上的路径

    Description 给定一棵\(N\)个结点的树,结点用正整数\(1 \dots N\)编号,每条边有一个正整数权值.用\(d(a, b)\)表示从结点\(a\)到结点\(b\)路径上经过边的权值 ...

  10. [BZOJ 3489] A simple rmq problem 【可持久化树套树】

    题目链接:BZOJ - 3489 题目分析 “因为是OJ上的题,就简单点好了.”——出题人 真的..好..简单... 首先,我们求出每个数的前一个与它相同的数的位置,即 prev[i] ,如果前面没有 ...