题目

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

10 17 4

Sample Output

2
【样例说明】
生产出的纸箱的三边长为(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

 

[Submit][Status]

题解

开始开坑刷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]纸箱堆叠的更多相关文章

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

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

  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. 管理node_modules

    http://stackoverflow.com/questions/15225865/centralise-node-modules-in-project-with-subproject

  2. ListView的简单使用和性能优化

    起源:ListView是Android开发中使用最广泛的一种控件,它以垂直列表的形式显示所有列表项. 创建ListView有两种方式: ☆ 直接使用ListView进行创建. ☆让Activity继承 ...

  3. 一些复数运算的C语言实现

    很久不写博客了.第一次写博客是在04年,最近的一次还是在大学时,在学校时,甚至还有过自己去买虚拟主机搭WordPress写博客的经历.现在工作时间越长,越发现积累的重要性.那么就从这里开始吧,重新开始 ...

  4. 特卖电商俏物悄语或面临破产 ihush域名夭折?:域名新闻:域名门户:eName.CN

    特卖电商俏物悄语或面临破产 ihush域名夭折?:域名新闻:域名门户:eName.CN 特卖电商俏物悄语或面临破产 ihush域名夭折?

  5. Address already in use: JVM_Bind <null>:8080

    解决方法: 1重开eclipse,端口号被占用,或者杀掉进程

  6. Lua学习2 Lua小框架的搭建

    看了上一篇Lua环境搭建具体http://blog.csdn.net/liuwumiyuhuiping/article/details/9196435 为了方便学习. 具体新开始搭建一下学习的小框架. ...

  7. poj 1094 Sorting It All Out(图论)

    http://poj.org/problem?id=1094 这一题,看了个大牛的解题报告,思路变得非常的清晰: 1,先利用floyd_warshall算法求出图的传递闭包 2,再判断是不是存在唯一的 ...

  8. bp神经网络及matlab实现

    本文主要内容包含: (1) 介绍神经网络基本原理,(2) AForge.NET实现前向神经网络的方法,(3) Matlab实现前向神经网络的方法 . 第0节.引例  本文以Fisher的Iris数据集 ...

  9. POJ 2342 树形DP入门题

    有一个大学的庆典晚会,想邀请一些在大学任职的人来參加,每一个人有自己的搞笑值,可是如今遇到一个问题就是假设两个人之间有直接的上下级关系,那么他们中仅仅能有一个来參加,求请来一部分人之后,搞笑值的最大是 ...

  10. jsp-forward跳转

    在Web中可以使用<jsp:forward>指令,将一个用户的请求(request)从一个页面传递到另一个页面,即完成跳转的操作. 1.调整前页:tiaozhuan_a.jsp 代码: & ...