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 工厂是一个生产纸箱的工厂. 纸 ...
随机推荐
- poco vs Boost[ZZ]
http://wooce.iteye.com/blog/634395 POCO的优点: 1) 比boost更好的线程库,特别是一个活动的方法的实现,并且还可设置线程的优先级. 2) 比 boost:a ...
- 判断浏览器及设备的打开方式,自动跳转app中
如果安装了APP则自动条状app,如果没安装则自动跳转下载页面 <head> 放在head中加载 <script> function redirect() { var appU ...
- jquery插件anccordion
(function(){ $.fn.YAccordion=function(options){ var settings={ trigger:'click', speed:300, }; if(opt ...
- C++设计模式之工厂模式
//产品父类声明#pragma once #include "iostream" using namespace std; class Product { public: virt ...
- 10.java.lang.FileNotFoundException
java.lang.FileNotFoundException 文件未找到异常 当程序试图打开一个不存在的文件进行读写时将会引发该异常.该异常由FileInputStream,FileOutputSt ...
- dell PowerEdge R720 自动重启分析
dell PowerEdge R720 自动重启分析 摘要: 一,问题描述: 在同一批服务器当中,碰到这样一台服务器,如果不跑任何服务时没有问题,但一跑任务就是自动重启.既然同样的系统别的服务器都没出 ...
- SendMessage基本认识
SendMessage基本认识 函数功能:该函数将指定的消息发送到一个或多个窗口.此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回.而函数PostMessage不同,将一个消息寄送到一个线 ...
- Android中pendingIntent的深入理解
pendingIntent字面意义:等待的,未决定的Intent.要得到一个pendingIntent对象,使用方法类的静态方法 getActivity(Context, int, Intent, i ...
- VC中利用多线程技术实现线程之间的通信
当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软 ...
- [Leetcode][Python]32: Longest Valid Parentheses
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 32: Longest Valid Parentheseshttps://oj ...