cdq分治+dp

看见三维偏序是cdq,互相包含是最长上升子序列

这个代码是错的

交了两份代码,发现手动出数据是不一样的。。。

不调了

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = ;
int n, lim, ans;
struct BIT {
int tree[N];
int lowbit(int i)
{
return i & (-i);
}
void update(int pos, int delta)
{
for(int i = pos; i <= lim; i += lowbit(i)) tree[i] = max(tree[i], delta);
}
int query(int pos)
{
int ret = ;
for(int i = pos; i; i -= lowbit(i)) ret = max(ret, tree[i]);
return ret;
}
void clr(int pos)
{
for(int i = pos; i <= lim; i += lowbit(i)) tree[i] = ;
}
} tr;
struct data {
ll x, y, z;
int type, id;
} f[N], g[N];
ll a, p;
map<ll, int> mp;
vector<ll> vt;
ll t[], c[];
int dp[N];
bool cpx(data A, data B)
{
if(A.x == B.x)
{
if(A.y == B.y) return A.z < B.z;
else return A.y < B.y;
}
return A.x < B.x;
}
bool cpy(data A, data B)
{
return A.y == B.y ? A.z < B.z : A.y < B.y;
}
void cdq(int l, int r)
{
if(l >= r) return;
int mid = (l + r) >> ;
while(f[mid].x == f[mid - ].x) --mid;
if(l > mid) return;
cdq(l, mid);
for(int i = l; i <= r; ++i) g[i] = f[i];
sort(f + l + , f + mid + , cpy);
sort(f + mid + , f + r + , cpy);
int i = l, j = mid + ;
while(j <= r)
{
while(i <= mid && f[i].y < f[j].y)
{
tr.update(f[i].z, dp[f[i].id]);
++i;
}
dp[f[j].id] = max(dp[f[j].id], tr.query(f[j].z - ) + );
ans = max(ans, dp[f[j].id]);
++j;
}
for(int i = l; i <= mid; ++i)
tr.clr(f[i].z);
for(int i = l; i <= r; ++i) f[i] = g[i];
cdq(mid + , r);
}
int main()
{
scanf("%lld%lld%d", &a, &p, &n);
ll p1 = a % p * a % p * a % p;
f[].id = ;
t[] = a % p;
t[] = a % p * a % p;
t[] = a % p * a % p * a % p;
for(int i = ; i <= ; ++i) c[i] = t[i];
sort(c + , c + );
f[].x = c[] * p1 % p;
f[].y = c[] * p1 % p;
f[].z = c[] * p1 % p;
vt.push_back(f[].z);
for(int i = ; i <= n; ++i)
{
t[] = t[] * p1 % p;
t[] = t[] * p1 % p;
t[] = t[] * p1 % p;
for(int j = ; j <= ; ++j) c[j] = t[j];
sort(c + , c + );
f[i].x = c[];
f[i].y = c[];
f[i].z = c[];
f[i].id = i;
vt.push_back(f[i].z);
}
sort(vt.begin(), vt.end());
vt.erase(unique(vt.begin(), vt.end()), vt.end());
for(int i = ; i < vt.size(); ++i) mp[vt[i]] = i + ;
for(int i = ; i <= n; ++i) f[i].z = mp[f[i].z];
lim = vt.size();
sort(f + , f + n + , cpx);
cdq(, n);
printf("%d\n", ans);
return ;
}

bzoj2253的更多相关文章

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

    [BZOJ2253][2010 Beijing wc]纸箱堆叠 Description P 工厂是一个生产纸箱的工厂.纸箱生产线在人工输入三个参数 n p a , , 之后,即可自动化生产三边边长为 ...

  2. BZOJ2253: [2010 Beijing wc]纸箱堆叠

    题解: 其实就是求三维偏序最长链.类似于三维逆序对,我们可以用树状数组套平衡树来实现. DP方程 :f[i]=max(f[j]+1) a[j]<a[i] 我们按一维排序,另一位建立树状数组,把第 ...

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

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

  4. bzoj2253 纸箱堆叠

    题目链接 题意 求三元组的严格上升子序列 思路 先考虑暴力\(dp\)一下 for(int i = 1;i <= n;++i) for(int j = 1;j < i;++j) if(x[ ...

  5. bzoj2253纸箱堆叠(动态规划+cdq分治套树状数组)

    Description P 工厂是一个生产纸箱的工厂.纸箱生产线在人工输入三个参数 n p a , 之后,即可自动化生产三边边长为 (a mod P,a^2 mod p,a^3 mod P) (a^4 ...

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

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

  7. cdq分治(偏序)

    偏序问题: https://www.luogu.org/blog/Owencodeisking/post-xue-xi-bi-ji-cdq-fen-zhi-hu-zheng-ti-er-fen 优质题 ...

随机推荐

  1. 06Oracle Database 数据类型

    Oracle Database 数据类型 字符型 char(n)最大2000个字节 定长 nchar(n)最大2000个字节 变长 varchar2(n) 最大4000个字节 变长 nvarchar2 ...

  2. 数据库——DBUtils和连接池

    第一章 DBUtils如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC开发,本案例我们讲采用apache commons组件一个成员:DBUtils.DBUtils就是JDBC的简 ...

  3. Appium 的xpath定位

    Appium 的xpath定位 1.如果元素text是唯一的,可以通过text文本定位 //*[@text=’text文本属性’] # 定位text driver.find_element_by_xp ...

  4. MySQL数据导入sql文件过程中出错

    错误类型: ERROR 1231 (42000): Variable 'time_zone' can't be set to the value of 'NULL' ERROR 1231 (42000 ...

  5. 一篇入门Express

    目录 1.安装 2.Hello World 3.基础路由设置 4.高级路由设置 5.静态文件 6.中间件 7.生成器 1.安装 Express 是一个 基于 Node.js 的简洁灵活的 Web 应用 ...

  6. 【Python实践-8】和为S的两个数字

    (剑指offer)输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 思路:选定第一个数字,然后遍历后面的数字求和并与S比 ...

  7. SQL Server数据库基础编程

    转载,查看原文 Ø Go批处理语句 用于同时执行多个语句 Ø 使用.切换数据库 use master go   Ø 创建.删除数据库 方法1. --判断是否存在该数据库,存在就删除 if (exist ...

  8. 腾讯云,搭建Git服务器

    下载安装 git 任务时间:5min ~ 10min Git 是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. 此实验以 CentOS 7.2 x64 的系统为环境,搭建 ...

  9. HDU 5493 Queue

    Queue Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

  10. mongodb shell之使用js(二)

    mongodb shell之使用js(二) mongodb shell不仅是个交互式shell,还能够使用js脚本进行访问. 使用js脚本进行交互的优点与缺点 (1)无需任何驱动或语言支持: (2)方 ...