BZOJ2253: [2010 Beijing wc]纸箱堆叠

题解:

其实就是求三维偏序最长链。类似于三维逆序对,我们可以用树状数组套平衡树来实现。

DP方程 :f[i]=max(f[j]+1) a[j]<a[i]

我们按一维排序,另一位建立树状数组,把第三维插入到每个树状数组的节点里。

除了权值之外每个节点还要保持一个mx,表示该子树内最大的f[i]。

这样就可以nlg^n了

UPD:试了下不带旋转的treap果然会被卡 orz

代码:

  1 #include<cstdio>
  2
  3 #include<cstdlib>
  4
  5 #include<cmath>
  6
  7 #include<cstring>
  8
  9 #include<algorithm>
 10
 11 #include<iostream>
 12
 13 #include<vector>
 14
 15 #include<map>
 16
 17 #include<set>
 18
 19 #include<queue>
 20
 21 #include<string>
 22
 23 #define inf 1000000000
 24
 25 #define maxn 150000+5
 26
 27 #define maxm 4000000+5
 28
 29 #define eps 1e-10
 30
 31 #define ll long long
 32
 33 #define pa pair<int,int>
 34
 35 #define for0(i,n) for(int i=0;i<=(n);i++)
 36
 37 #define for1(i,n) for(int i=1;i<=(n);i++)
 38
 39 #define for2(i,x,y) for(int i=(x);i<=(y);i++)
 40
 41 #define for3(i,x,y) for(int i=(x);i>=(y);i--)
 42
 43 #define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go)
 44
 45 #define for5(n,m) for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)
 46
 47 #define mod 1000000007
 48
 49 using namespace std;
 50
 51 inline ll read()
 52
 53 {
 54
 55     ll x=0,f=1;char ch=getchar();
 56
 57     while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
 58
 59     while(ch>=‘0‘&&ch<=‘9‘){x=10*x+ch-‘0‘;ch=getchar();}
 60
 61     return x*f;
 62
 63 }
 64 int n,tot,cnt,b[maxn],f[maxn],rt[maxn],c[maxn],d[maxn];
 65 int h[maxm],mx[maxm],l[maxm],r[maxm],v[maxm],vv[maxm];
 66 struct rec{int x,y,z;}a[maxn];
 67 bool operator <(rec a,rec b){return a.x<b.x;}
 68 inline void pushup(int k)
 69 {
 70     mx[k]=max(vv[k],max(mx[l[k]],mx[r[k]]));
 71 }
 72 inline void lturn(int &k)
 73 {
 74     int t=r[k];r[k]=l[t];l[t]=k;pushup(k);pushup(t);k=t;
 75 }
 76 inline void rturn(int &k)
 77 {
 78     int t=l[k];l[k]=r[t];r[t]=k;pushup(k);pushup(t);k=t;
 79 }
 80 inline void insert(int &k,int x,int y)
 81 {
 82     if(!k)
 83     {
 84         k=++tot;v[k]=x;h[k]=rand();vv[k]=mx[k]=y;
 85         return;
 86     }
 87     if(x==v[k])vv[k]=max(vv[k],y);
 88     else if(x<v[k]){insert(l[k],x,y);if(h[k]<h[l[k]])rturn(k);}
 89     else {insert(r[k],x,y);if(h[k]<h[r[k]])lturn(k);}
 90     pushup(k);
 91 }
 92 inline int getmx(int k,int x)
 93 {
 94     if(!k)return 0;
 95     if(v[k]==x)return max(mx[l[k]],vv[k]);
 96     else if(x<v[k])return getmx(l[k],x);
 97     else return max(max(mx[l[k]],vv[k]),getmx(r[k],x));
 98 }
 99 inline int query(int x,int y)
100 {
101     int ret=0;
102     for(;x;x-=x&(-x)){ret=max(ret,getmx(rt[x],y));}
103     return ret;
104 }
105 inline void add(int x,int y,int z)
106 {
107     for(;x<=cnt;x+=x&(-x))insert(rt[x],y,z);
108 }
109 inline bool cmp(int x,int y){return b[x]<b[y];}
110
111 int main()
112
113 {
114
115     freopen("input.txt","r",stdin);
116
117     freopen("output.txt","w",stdout);
118
119     ll t=read(),p=read();n=read();b[0]=1;
120     for1(i,3*n)b[i]=(ll)b[i-1]*t%p,c[i]=i;
121     sort(c+1,c+3*n+1,cmp);
122     cnt=0;
123     for1(i,3*n)
124     {
125         if(i==1||b[c[i]]!=b[c[i-1]])cnt++;
126         d[c[i]]=cnt;
127     }
128     for1(i,n)a[i].x=d[3*i-2],a[i].y=d[3*i-1],a[i].z=d[3*i];
129     for1(i,n)
130     {
131         if(a[i].y>a[i].x)swap(a[i].x,a[i].y);
132         if(a[i].z>a[i].x)swap(a[i].x,a[i].z);
133         if(a[i].z>a[i].y)swap(a[i].z,a[i].y);
134     }
135     sort(a+1,a+n+1);
136     for(int l=1,r=1;l<=n;r++,l=r)
137     {
138         while(a[r+1].x==a[l].x)r++;
139         for2(i,l,r)f[i]=query(a[i].y-1,a[i].z-1)+1;//cout<<i<<‘ ‘<<f[i]<<endl;
140         for2(i,l,r)add(a[i].y,a[i].z,f[i]);
141     }
142     int ans=0;
143     for1(i,n)ans=max(ans,f[i]);
144     cout<<ans<<endl;
145
146     return 0;
147
148 }  

2253: [2010 Beijing wc]纸箱堆叠

Time Limit: 30 Sec  Memory Limit: 256 MB
Submit: 246  Solved: 96
[Submit][Status]

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

时间: 2024-10-15 17:54:26

BZOJ2253: [2010 Beijing wc]纸箱堆叠的相关文章

BZOJ2253 2010 Beijing wc 纸箱堆叠 CDQ分治

这题之前度娘上没有CDQ分治做法,gerwYY出来以后写了一个.不过要sort3遍,常数很大. gerw说可以类似划分树的思想优化复杂度,但是蒟蒻目前不会划分树(会了主席树就懒得去弄了). 嗯 将memset改成手动clear会快很多. 还有就是第一维相同的情况,划分为两个不存在第一维相同的两个区间即可. #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #inc

【BZOJ2253】[2010 Beijing wc]纸箱堆叠 cdq分治

[BZOJ2253][2010 Beijing wc]纸箱堆叠 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个纸箱.在运输这些纸箱时,为了节约空间,必须将它们嵌套堆叠起来.一个纸箱可以嵌套

【BZOJ】【2253】【WC 2010 BeijingWC】纸箱堆叠

树套树 Orz zyf 我的树套树不知道为啥一直WA……只好copy了zyf的写法TAT 这题还可以用CDQ分治来做……但是蒟蒻不会…… //y坐标的树状数组是按权值建的……所以需要离散化…… 1 /************************************************************** 2 Problem: 2253 3 User: Tunix 4 Language: C++ 5 Result: Accepted 6 Time:2808 ms 7 Memor

bzoj 2252 [ 2010 Beijing wc ] 矩阵距离 —— 多源bfs

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2252 又没能自己想出来... 一直在想如何从每个1开始广搜更新答案,再剪剪枝,什么遇到1就不走了... 然而实际上直接多源bfs,从所有1一起开始,因为只需要找到0碰到的第一个1即可: 这样搜一遍就可以,复杂度很美. 代码如下: #include<iostream> #include<cstdio> #include<cstring> #include<al

BZOJ 1270 Beijing Wc 2008 雷涛的小猫 动态规划

题目大意:给出一个棵果树,上面有些地方长了一些果子.现在有一只小猫想去吃这些果子,他从最高处往下跳,每到一个地方可以吧这个地方的果子全吃掉.也可以向旁边的果树上跳.问小猫最多能吃到多少果子. 思路:WC的无脑动规大水题.随便加个小优化就过了.. CODE: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define MAX 3510 using n

构建可扩展的微博架构(qcon beijing 2010演讲)

构建可扩展的微博架构(qcon beijing 2010演讲) http://timyang.net/architecture/microblog-design-qcon-beijing/ 互联网架构优化_杨卫华:新浪微博技术总监 http://wenku.baidu.com/view/159357b6941ea76e58fa04bc.html?re=view ================ 这里再补充在qcon演讲未来得及考虑成熟的一个方面,用户规模影响设计,具体是指用户数每上一个数量级,许

【转】构建可扩展的微博架构(qcon beijing 2010演讲) by Tim Yang

在使用Twitter几年的时间里面,经常思考微博如何更好的实现,恰好最近几个月也参与了相关工作,大部分都是工程实践,总结实践会促生更具实际价值的理论.因此在QCon Beijing 2010这次演讲参考了不少网友的意见后选择了<构建可扩展微博架构>的题目.   由于在决定选题时知道来自Twitter总部有30万followers的@nk也会讲一个类似的题目,心中当时有点忐忑,最大的顾虑就是要讲的领域更他重叠,如果他讲得更深入,我就没必要班门弄斧了.后来考虑到以下几个原因还是决定继续 Twitt

【BZOJ 1758】【WC 2010】重建计划 分数规划+点分治+单调队列

一开始看到$\frac{\sum_{}}{\sum_{}}$就想到了01分数规划但最终还是看了题解 二分完后的点分治,只需要维护一个由之前处理过的子树得出的$tb数组$,然后根据遍历每个当前的子树上的结点的深度来确定$tb数组$中的滑块. 因为分数规划要找的是$max$,BFS遍历当前结点的深度越来越大,这样滑块也是单调向右滑动,所以滑块里的最大值就应当用单调队列解决 #include<cstdio> #include<algorithm> #define read(x) x=ge

【bzoj4864】[BeiJing 2017 Wc]神秘物质 Splay

原文地址:http://www.cnblogs.com/GXZlegend/p/6801631.html 题目描述 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微观粒子.这一天, 小诚刚从研究所得到了一块奇异的陨石样本, 便迫不及待地开始观测. 在精密仪器的视野下,构成陨石的每个原子都无比清晰. 小诚发现, 这些原子排成若干列, 每一列的结构具有高度相似性.于是,他决定对单独一列原子进行测量和测试.被选中的这列共有 N 个顺序排列