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 优质题 ...
随机推荐
- 关于Java IM的一点资料
微信是腾讯采用自己开发的协议做的,其他市面上很多产品大都是采用XMPP协议,包括米聊在内之前也是这样子. 采用XMPP协议,服务端可以采用OpenFire搭建,客户端有个开源的叫asmack的东西,g ...
- Spring MVC 3.2 406 Not Acceptable
Spring MVC 3.2 406 Not Acceptable 这个报错主要是因为SpringMVC配置文件配置问题. 修改步骤如下: 首先,修改spring-mvc.xsd为 spring-mv ...
- session与cookie的区别,有哪些不同之处
session与cookie的区别,根据自己的理解总结如下: (1)cookie是一种客户端的状态管理技术,将状态写在 浏览器端,而session是一种服务器端的状态管理技术,将 状态写在web服务器 ...
- 《C和指针》章节后编程练习解答参考——6.6
<C和指针>——6.6 题目: 在指定的下限.上限之间使用数组方法查找质数,并将质数提取出来. 要求: 略 解答代码: #include <stdio.h> #define U ...
- 初学socket,c语言写的简单局域网聊天
在客户端所在的目录新建一个IP.bwj的文件,写上服务端的IP,不要带空格,保存.双方都打开一个客户端和一个服务端就可以聊天了,(可以写自己的IP,自己跟自己聊..)没有第三方服务器,服务端所在的电脑 ...
- 支付宝集成SDK 报错
1.打开Demo中的错误 这是路径错误导致 解决办法:在Build Settings 中找到 Library Search Paths ,去掉其中的 /// 2.自己集成支付宝SDK时的错误 这个也是 ...
- Zoj 3865 Superbot
按规则移动机器人 , 问是否能拾得宝藏 . 加了一个控制板 , 还增加了一个控制板移动周期 p 将移动周期变换一下 , 移动一次 就相当于光标向左不耗费时间的移动了一格 搜索思路 : 搜索当前格子到 ...
- 你的 Docker 应用是安全的吗?
近一年来,Docker 已经逐渐成为 container 界的事实标准,成为技术人员不可或缺的技能之一,就像 Docker 宣称的那样,「Build,Ship,and Run Any App,Anyw ...
- Feel Good
poj2796:http://poj.org/problem?id=2796 题意:给出一个长度为n(n<100000)的序列,求出一个子序列,使得这个序列中的最小值乘以这个序列的和的值最大. ...
- Keil 的辅助工具和部份高级技巧
在前面的几讲中我们介绍了工程的建立方法,常用的调试方法,除此之外,Keil 还提供 了一些辅助工具如外围接口.性能分析.变量来源分析.代码作用分析等,帮助我们了解程 的性能.查找程序中的隐藏错误,快速 ...