树套树


  Orz zyf

  我的树套树不知道为啥一直WA……只好copy了zyf的写法TAT

  这题还可以用CDQ分治来做……但是蒟蒻不会……

//y坐标的树状数组是按权值建的……所以需要离散化……

 /**************************************************************
Problem: 2253
User: Tunix
Language: C++
Result: Accepted
Time:2808 ms
Memory:76280 kb
****************************************************************/ //BZOJ 2253
#include<cmath>
#include<vector>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
#define CC(a,b) memset(a,b,sizeof(a))
using namespace std;
int getint(){
int v=,sign=; char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') sign=-; ch=getchar();}
while(isdigit(ch)) {v=v*+ch-''; ch=getchar();}
return v*sign;
}
const int N=,M=,INF=~0u>>;
typedef long long LL;
const double eps=1e-;
/*******************template********************/
int n,tot,l[M],r[M],s[M],rnd[M],v[M],f[N],mx[M];
#define L l[x]
#define R r[x]
inline void Push_up(int x){ mx[x]=max(max(mx[L],mx[R]),s[x]); }
inline void zig(int &x){int t=L; L=r[t]; r[t]=x; Push_up(x); Push_up(t); x=t;}
inline void zag(int &x){int t=R; R=l[t]; l[t]=x; Push_up(x); Push_up(t); x=t;}
void ins(int &x,int val,int num){
if (!x){
x=++tot; v[x]=val; s[x]=mx[x]=num; L=R=; rnd[x]=rand(); return;
}
if(v[x]==val) s[x]=max(s[x],num);
else if(val<v[x]){
ins(L,val,num); if (rnd[L]<rnd[x]) zig(x);
}else{
ins(R,val,num); if (rnd[R]<rnd[x]) zag(x);
}
Push_up(x);
}
int rank(int x,int val){
if (!x) return ;
if (v[x]==val) return max(mx[L],s[x]);
else if (val<v[x]) return rank(L,val);
else return max(max(s[x],mx[L]),rank(R,val));
}
#undef L
#undef R
/********************Treap**********************/
int rt[N],_num,b[N],c[N],d[N];
void update(int x,int val,int num){
for(int i=x;i<=_num;i+=i&-i) ins(rt[i],val,num);
}
int query(int x,int val){
int ans=;
for(int i=x;i;i-=i&-i) ans=max(ans,rank(rt[i],val));
return ans;
}
/*******************Fenwick*********************/
struct data{
int x,y,z;
}a[N];
bool cmp(data a,data b){
return a.x<b.x;
}
bool cmp2(int x,int y){return b[x]>b[y];}
void init(){
LL A=getint(),P=getint();
n=getint();
b[]=;
F(i,,n*) b[i]=(LL)b[i-]*A%P,c[i]=i;
sort(c+,c+*n+,cmp2);
_num=;
F(i,,*n){
if (i== || b[c[i]]!=b[c[i-]]) _num++;
d[c[i]]=_num;
}
F(i,,n) a[i].x=d[*i-],a[i].y=d[*i-],a[i].z=d[*i];
F(i,,n){
if (a[i].y>a[i].x) swap(a[i].x,a[i].y);
if (a[i].z>a[i].x) swap(a[i].x,a[i].z);
if (a[i].z>a[i].y) swap(a[i].y,a[i].z);
}
sort(a+,a+n+,cmp);
}
int main(){
#ifndef ONLINE_JUDGE
freopen("input.txt","r",stdin);
// freopen("output.txt","w",stdout);
#endif
init();
int ans=;
for(int l=,r=;l<=n;r++,l=r){
while(a[r+].x==a[l].x) r++;
F(i,l,r) f[i]=query(a[i].y-,a[i].z-)+;
F(i,l,r) update(a[i].y,a[i].z,f[i]);
}
F(i,,n) ans=max(f[i],ans);
printf("%d\n",ans);
return ;
}
//y坐标的树状数组是按权值建的……所以需要离散化……

【BZOJ】【2253】【WC 2010 BeijingWC】纸箱堆叠的更多相关文章

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

    题目 2253: [2010 Beijing wc]纸箱堆叠 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 239  Solved: 94 Descr ...

  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. 纸箱堆叠 bzoj 2253

    纸箱堆叠 (1s 128MB) box [问题描述] P 工厂是一个生产纸箱的工厂.纸箱生产线在人工输入三个参数 n, p, a 之后,即可自动化生产三边边长为 (a mod P, a^2 mod p ...

  6. 【BZOJ2253】纸箱堆叠 [CDQ分治]

    纸箱堆叠 Time Limit: 30 Sec  Memory Limit: 256 MB[Submit][Status][Discuss] Description P 工厂是一个生产纸箱的工厂. 纸 ...

  7. [BZOJ 2006] [NOI 2010]超级钢琴(贪心+ST表+堆)

    [BZOJ 2006] [NOI 2010]超级钢琴(贪心+ST表+堆) 题面 给出一个长度为n的序列,选k段长度在L到R之间的区间,一个区间的值等于区间内所有元素之的和,使得k个区间的值之和最大.区 ...

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

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

  9. BZOJ2253 2010 Beijing wc 纸箱堆叠 CDQ分治

    这题之前度娘上没有CDQ分治做法,gerwYY出来以后写了一个.不过要sort3遍,常数很大. gerw说可以类似划分树的思想优化复杂度,但是蒟蒻目前不会划分树(会了主席树就懒得去弄了). 嗯 将me ...

随机推荐

  1. 关于Java中计算日期差值不准确问题

    1.字符串日期相减 如:2016-4-1,必须先将此字符串转成Date对象,并且, 格式必须为:yyyy—MM—dd  HH:mm:ss. 如果不转就直接计算(2016-4-1)两个这样的日期,则误差 ...

  2. php29号小结(隔行换色······)

    1.给表单加样式,可以用css.php与js.js这三种,其中最好用php与js,现在很推广用这种. css3样式隔行换色(table中) tr:nth-child(even){ background ...

  3. (转)MongoDB 实现currentOp定时捕获

    问题描述: 当分析生产环境发生的性能问题时,常常因为没有实时的依据而无从下手.那么笔者通过捕获db.currentOp()到文件,并作为定时任务,可供后续分析. 解决方法: 步骤一:Shell脚本记录 ...

  4. [javascript|基本概念]学习笔记

    1/语法 a.区分大小写 b.标识符(首字符必须是字母/"_"/"$",其他可为字母/"_"/"$"/数字,不能用关键字 ...

  5. EasyUI form ajax submit到MVC后,在IE下提示下载内容的解决办法

    问题描述: 项目环境为,.Net Mvc5+EF6……前端框架使用的是EasyUI v1.4.4. 在视图页面中,使用form的submit方法提交表单数据时,如果是使用IE的话,请求成功后IE会提示 ...

  6. MySQL之左连接与右连接

    左连接: select 列1,列2,列N from tableA left join tableB on tableA.列 = tableB.列(正常是一个外键列) [此处表连接成一张大表,完全当成一 ...

  7. 关于java的转义字符

    关于java的转义字符 我们都知道  String s="ad,dfjdlfs,df,s,dfl";              执行 String re[]=s.split(&qu ...

  8. Linux C 程序 进程间通信(20)

    进程间通信 1.进程间通信的几种手段:    (1).管道        数据只能由一个进程流向另一个进程(其中一个读管道,一个写管道),如果要建立全双工通信,需要建立两个管道        只能用于 ...

  9. 【Sharing】如何成为一名黑客

    [声明]此文为转载,只为收藏. 从小到大听说了无数关于“电脑黑客”的故事,比如XXX入侵美国五角大楼,再比如前几年的“熊猫烧香”病毒,这些故事的主角都被我们的媒体称之为“黑客”.其实这些人,更大程度上 ...

  10. Dynamic - ExpandoObject学习心得

    1.  今天下午在做开发过程中,遇到了一个问题,要往Xml文件中添加新的节点,做个xml开发的都知道该怎么做,这不是什么难事,我卡卡卡卡把这个问题解决了,但是新问题又来了,要对xml中对应的节点数据添 ...