BZOJ 2253: [2010 Beijing wc]纸箱堆叠
题目
2253: [2010 Beijing wc]纸箱堆叠
Time Limit: 30 Sec Memory Limit: 256 MB
Submit: 239 Solved: 94
Description
P 工厂是一个生产纸箱的工厂。纸箱生产线在人工输入三个参数 n p a , , 之后,
即可自动化生产三边边长为
(a mod P,a^2 mod p,a^3 mod P)
(a^4 mod p,a^5 mod p,a^6 mod P)
....
(a^(3n-2) mod p,a^(3n-1) mod p,a^(3n) mod p)
的n个纸箱。在运输这些纸箱时,为了节约空间,必须将它们嵌套堆叠起来。
一个纸箱可以嵌套堆叠进另一个纸箱当且仅当它的最短边、次短边和最长边
长度分别严格小于另一个纸箱的最短边、次短边和最长边长度。这里不考虑
任何旋转后在对角线方向的嵌套堆叠。
你的任务是找出这n个纸箱中数量最多的一个子集,使得它们两两之间都可
嵌套堆叠起来。
Input
输入文件的第一行三个整数,分别代表 a,p,n
Output
输出文件仅包含一个整数,代表数量最多的可嵌套堆叠起来的纸箱的个数。
Sample Input
Sample Output
【样例说明】
生产出的纸箱的三边长为(10, 15, 14), (4, 6, 9) , (5, 16, 7), (2, 3, 13)。其中只有
(4, 6, 9)可堆叠进(5, 16, 7),故答案为 2。
2<=P<=2000000000,1<=a<=p-1,a^k mod p<>0,ap<=2000000000,1<=N<=50000
HINT
Source
题解
开始开坑刷WC的题,这一道题主体思路反正就是统计x,y,z都小于自己的有多少个。第一维用排序,剩下两维用二维树状数组。统计最大值就可以了,话说我也一下子Get到了树状数组最大值Orz= =,然后其中需要暴力离散化一下,p太大了。
代码
/*Author:WNJXYK*/
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std; const int Maxn=;
map<pair<int,int>,int> tree; struct Box{
long long x,y,z;
Box(){}
inline void swap(long long &x,long long &y){
long long tmp=x;
x=y;
y=tmp;
}
Box(long long a,long long b,long long c){
if (a>b) swap(a,b);
if (b>c) swap(b,c);
if (a>b) swap(a,b);
x=a;y=b;z=c;
}
};
Box b[];
bool cmp(Box a,Box b){
if (a.x<b.x) return true;
if (a.x==b.x && a.y<b.y) return true;
if (a.x==b.x && a.y==b.y && a.z<b.z) return true;
return false;
} inline int lowbit(int x){
return x&-x;
} inline int remax(int a,int b){
if (a<b) return b;
return a;
} inline void update(int x,int y,int val){
for (int i=x;i<=Maxn;i+=lowbit(i)){
for (int j=y;j<=Maxn;j+=lowbit(j)){
tree[make_pair(i,j)]=remax(tree[make_pair(i,j)],val);
}
}
} inline int getAns(int x,int y){
int res=;
for (int i=x;i;i-=lowbit(i)){
for (int j=y;j;j-=lowbit(j)){
res=remax(res,tree[make_pair(i,j)]);
}
}
return res;
} long long a,n,p; int index;
int hash[];
map<long long,int> delta; int main(){
scanf("%lld%lld%lld",&a,&p,&n);
int x,y,z;
long long tmp=;
for (int i=;i<=n;i++){
tmp=((long long)tmp*(long long)a)%(long long)p;
x=tmp;
tmp=((long long)tmp*(long long)a)%(long long)p;
y=tmp;
tmp=((long long)tmp*(long long)a)%(long long)p;
z=tmp;
b[i]=Box(x,y,z);
}
sort(b+,b+n+,cmp); hash[]=-;
index=;
for (int i=;i<=n;i++)hash[i]=b[i].y;
sort(hash+,hash+n+);
for (int i=;i<=n;i++)if (hash[i]>hash[i-]) delta[hash[i]]=++index; else delta[hash[i]]=index;
for (int i=;i<=n;i++) b[i].y=delta[b[i].y];
hash[]=-;
index=;
for (int i=;i<=n;i++)hash[i]=b[i].z;
sort(hash+,hash+n+);
for (int i=;i<=n;i++)if (hash[i]>hash[i-]) delta[hash[i]]=++index; else delta[hash[i]]=index;
for (int i=;i<=n;i++) b[i].z=delta[b[i].z]; int Ans=;
for (int i=;i<=n;i++){
tmp=getAns(b[i].y-,b[i].z-);
update(b[i].y,b[i].z,tmp+);
Ans=remax(tmp+,Ans);
} printf("%d\n",Ans); return ;
}
BZOJ 2253: [2010 Beijing wc]纸箱堆叠的更多相关文章
- 【BZOJ】2253: [2010 Beijing wc]纸箱堆叠
题意 三维严格偏序最长链.(\(n \le 50000\)) 分析 按第一维排序然后以第二和第三维作为关键字依次加入一个二维平面,维护前缀矩形最大值. 题解 当然可以树套树....可是似乎没有随机化算 ...
- BZOJ2253: [2010 Beijing wc]纸箱堆叠
题解: 其实就是求三维偏序最长链.类似于三维逆序对,我们可以用树状数组套平衡树来实现. DP方程 :f[i]=max(f[j]+1) a[j]<a[i] 我们按一维排序,另一位建立树状数组,把第 ...
- 【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 纸箱堆叠 CDQ分治
这题之前度娘上没有CDQ分治做法,gerwYY出来以后写了一个.不过要sort3遍,常数很大. gerw说可以类似划分树的思想优化复杂度,但是蒟蒻目前不会划分树(会了主席树就懒得去弄了). 嗯 将me ...
- bzoj 2252 [ 2010 Beijing wc ] 矩阵距离 —— 多源bfs
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2252 又没能自己想出来... 一直在想如何从每个1开始广搜更新答案,再剪剪枝,什么遇到1就不 ...
- 【BZOJ】【2253】【WC 2010 BeijingWC】纸箱堆叠
树套树 Orz zyf 我的树套树不知道为啥一直WA……只好copy了zyf的写法TAT 这题还可以用CDQ分治来做……但是蒟蒻不会…… //y坐标的树状数组是按权值建的……所以需要离散化…… /** ...
- 纸箱堆叠 bzoj 2253
纸箱堆叠 (1s 128MB) box [问题描述] P 工厂是一个生产纸箱的工厂.纸箱生产线在人工输入三个参数 n, p, a 之后,即可自动化生产三边边长为 (a mod P, a^2 mod p ...
- 【BZOJ2253】纸箱堆叠 [CDQ分治]
纸箱堆叠 Time Limit: 30 Sec Memory Limit: 256 MB[Submit][Status][Discuss] Description P 工厂是一个生产纸箱的工厂. 纸 ...
随机推荐
- QF——UI之几种常用的隐藏键盘的方法
怎么在填写完UITextField之后,点击空白处,隐藏软键盘. 下面两个方法都可以隐藏键盘 [tf resignFirstResponder]; 停止textfield的第一响应者 [self.vi ...
- VueJS搭建简单后台管理系统框架(一)环境搭建
做这份笔记的时候,Vue.js还是1.0,10月份Vue已经升级到2.0,这边也进行相应的更新,用Vue2.0进行一个简单的环境搭建 饿了么也刚好开源了其基于Vue.js的UI框架element-ui ...
- python 日期、时间戳转换
获取当前日期: from datetime import datetime IN:datetime.now() OUT:datetime(2016,10,19,6,51,21,72341) 转化为字符 ...
- Ubuntu各种软件的安装
普通的例如g++.deadbeef等源中有的软件,可以用apt-get安装 sudo apt-get install XXX 还有很多直接在software center搜索下载 对于下载来源代码需要 ...
- windbg命令学习4
4.查看调用栈 k命令:显示的是一定数量的栈帧, 其中帧的数量是由.kframes命令来控制的, 默认值是256. 我们如何来判断函数的栈指针,参数地址和局部变量地址呢? 举一个简单的windbg的k ...
- JS中的prototype属性
JavaScript是基于对象的,任何元素都可以看成对象.然而,类型和对象是不同的.本文中,我们除了讨论类型和对象的一些特点之外,更重要的 是研究 如何写出好的并且利于重用的类型.毕竟,JavaSc ...
- java 一致性哈希类实例 算法
package com.hash; import java.util.Collection; import java.util.SortedMap; import java.util.TreeMap; ...
- 剑指offer26 复杂链表的复制
/* struct RandomListNode { int label; struct RandomListNode *next, *random; RandomListNode(int x) : ...
- GDI+ 填充背景时,非常多时候不起作用,GDI、GDI+配合运用
在ONDRAW中运行GDI+ 填充背景时,不起作用,不知道什么原因 [cpp] view plaincopy Graphics graphics(pDC->GetSafeHdc()); Bitm ...
- 金山卫士开源软件之旅(十) KSafeMainproject的分析 1
上一次看金山开源到如今已有一两个月了.期间看到QQ群里大家对它非常是热情. 近期有时间想看看金山的主界面projectKSafeMain,自己水平有限,总结的东西浅显.但还是愿意拿来与大家分享.希望对 ...