题目

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. mysql 5.6.20的安装、配置服务、设置编码格式

    一.安装 安装环境        系统:Window 32        版本:Mysql 5.6.20 1. 首先从官网上http://dev.mysql.com/downloads/mysql/ ...

  2. [原创]抢先DriverStudio夺取机器控制权(上篇)

    原文链接:抢先DriverStudio夺取机器控制权 废话不谈,言归正传!大家都知道,装了DriverStudio软件(我使用的是v3.2版)的系统在启动时会显示其配置画面,(如图0所示) 图 0 这 ...

  3. matlab 相关性分析

    Pearson相关系数 考察两个事物(在数据里我们称之为变量)之间的相关程度,简单来说就是衡量两个数据集合是否在一条线上面.其计算公式为: 或或 N表示变量取值的个数. 相关系数r的值介于–1与+1之 ...

  4. Centos 升级MySQL版本或者Yum安装Mysql5.6

    Centos 升级MySQL版本或者Yum安装Mysql5.6 1.从MySQL Yum仓库下载最新的rpm文件:http://dev.mysql.com/downloads/repo/yum/Cen ...

  5. TraceView简单使用方法

    一.TraceView简介 TraceView是AndroidSDK里面自带的工具,用于对Android的应用程序以及Framework层的代码进行性能分析. TraceView是图形化的工具,最终它 ...

  6. 【转】Loss Function View

    感谢原文作者!原文地址:http://eletva.com/tower/?p=186 一.Loss Function 什么是Loss Function?wiki上有一句解释我觉得很到位,引用一下:Th ...

  7. android 抽屉式滑动demo

    下载地址:https://github.com/asijack/AndroidDrawerDemo 直接上效果图如下: 是不是还不错的样子. 先看看布局文件吧 <android.support. ...

  8. Android 读取Assets中图片

    bgimg0 = getImageFromAssetsFile("Cat_Blink/cat_blink0000.png"); * * 从Assets中读取图片 */ privat ...

  9. TabHost 简单用法

    package com.google.tabhost;    import android.app.TabActivity;  import android.os.Bundle;  import an ...

  10. Java操作mongoDB2.6的常见API使用方法

    对于mongoDB而言,学习方式和学习关系型数据库差不太多 開始都是学习怎样insert.find.update.remove,然后就是分页.排序.索引,再接着就是主从复制.副本集.分片等等 最后就是 ...