BZOJ2253 2010 Beijing wc 纸箱堆叠 CDQ分治
这题之前度娘上没有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分治的更多相关文章
- 【BZOJ2253】[2010 Beijing wc]纸箱堆叠 cdq分治
[BZOJ2253][2010 Beijing wc]纸箱堆叠 Description P 工厂是一个生产纸箱的工厂.纸箱生产线在人工输入三个参数 n p a , , 之后,即可自动化生产三边边长为 ...
- BZOJ_2253_[2010 Beijing wc]纸箱堆叠 _CDQ分治+树状数组
BZOJ_2253_[2010 Beijing wc]纸箱堆叠 _CDQ分治+树状数组 Description P 工厂是一个生产纸箱的工厂.纸箱生产线在人工输入三个参数 n p a , , 之后, ...
- BZOJ2253: [2010 Beijing wc]纸箱堆叠
题解: 其实就是求三维偏序最长链.类似于三维逆序对,我们可以用树状数组套平衡树来实现. DP方程 :f[i]=max(f[j]+1) a[j]<a[i] 我们按一维排序,另一位建立树状数组,把第 ...
- BZOJ 2253: [2010 Beijing wc]纸箱堆叠
题目 2253: [2010 Beijing wc]纸箱堆叠 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 239 Solved: 94 Descr ...
- 【BZOJ】2253: [2010 Beijing wc]纸箱堆叠
题意 三维严格偏序最长链.(\(n \le 50000\)) 分析 按第一维排序然后以第二和第三维作为关键字依次加入一个二维平面,维护前缀矩形最大值. 题解 当然可以树套树....可是似乎没有随机化算 ...
- 【BZOJ2253】纸箱堆叠 [CDQ分治]
纸箱堆叠 Time Limit: 30 Sec Memory Limit: 256 MB[Submit][Status][Discuss] Description P 工厂是一个生产纸箱的工厂. 纸 ...
- 【BZOJ】【2253】【WC 2010 BeijingWC】纸箱堆叠
树套树 Orz zyf 我的树套树不知道为啥一直WA……只好copy了zyf的写法TAT 这题还可以用CDQ分治来做……但是蒟蒻不会…… //y坐标的树状数组是按权值建的……所以需要离散化…… /** ...
- bzoj 2252 [ 2010 Beijing wc ] 矩阵距离 —— 多源bfs
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2252 又没能自己想出来... 一直在想如何从每个1开始广搜更新答案,再剪剪枝,什么遇到1就不 ...
- cdq分治(偏序)
偏序问题: https://www.luogu.org/blog/Owencodeisking/post-xue-xi-bi-ji-cdq-fen-zhi-hu-zheng-ti-er-fen 优质题 ...
随机推荐
- hdu 1573 A/B (扩展欧几里得)
Problem Description 要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973)= 1). Input 数据的第一行 ...
- android入门到熟练(三)----UI界面
1.TextView 以下只是一部分属性,还有很多属性需要在用到时候再说 <TextView android:textSize="24sp"//文字大小 android:te ...
- 当 IDENTITY_INSERT 设置为 OFF 时,不能向表 中的标识列插入显式值错误的解决方法
一个主键.两个外键,把两个外键改为非空就行了. CREATE TABLE [dbo].[User_Compare]( ,) NOT NULL, [UserId] [int] NOT NULL, [Pa ...
- 动画特效的原生、jQ和CSS3方法
最近一直在看运动的JS特效,主要看的是原生写法,太麻烦了,最终看到写了个运动的方法,后面可以直接引用,然后发现这个方法和jQ其实差不多了,代码分别如下: 基本的HMTL和CSS <!DOCTYP ...
- PHP创建桌面快捷方式实例
要利用php创建桌面快捷方式我们需要借助于header,InternetShortcut及一些我看不懂的代码. 方法:新建一个php文件,然后把下面的代码扔进去,保存为比如shortcut.php,放 ...
- c++清除输入缓冲区之 sync() vs ignore()
最近在写程序的时候总是不注意输入缓冲区内是否还有东西,导致出现了一些异常,调试了半天.所以来上一贴,学习注意,引以为戒! http://blog.chinaunix.net/uid-21254310- ...
- 转: QtCreator调试程序时GDB崩溃
这个情况出现在QtCreator的2.5版以上,是由于新版QtCreator至少需要7.2 IIRC版的GDB.可以到:http://builds.qt-project.org/job/gdb-win ...
- POJ 2965 The Pilots Brothers' refrigerator 位运算枚举
The Pilots Brothers' refrigerator Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 151 ...
- MFC窗口分割以及各窗口间的通讯
一个偶然的机会又重新接触了MFC窗口的分割,自己结合资料重新写了一个窗口分割的程序,现将具体流程跟大家分享一下: 1.我们先创建一个MFC单文档类的程序,具体分割方式先将单文档整个客户区分成两行一列, ...
- hadoop 常用配置项
core-site.xml name value Description fs.default.name hdfs://hadoopmaster:9000 定义HadoopMaster的URI ...