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. 安装svn

    一.安装 1.查看是否安装cvs rpm -qa | grep subversion 2.安装 yum install subversion 3.测试是否安装成功 /usr/bin/svnserve ...

  2. 【Redis】二、Redis高级特性

    (三) Redis高级特性   前面我们介绍了Redis的五种基本的数据类型,灵活运用这五种数据类型是使用Redis的基础,除此之外,Redis还有一些特性,掌握这些特性能对Redis有进一步的了解, ...

  3. Linux常用命令——目录处理命令

    1.建立目录:mkdir mkdir -p [目录名] -p 递归创建 命令英文原意:make directories 实例: [root@localhost ~]# ls anaconda-ks.c ...

  4. Intellij idea 生成for循环代码块

    itar 生成array for代码块 for (int i = 0; i < array.length; i++) { = array[i]; } itco 生成Collection迭代 fo ...

  5. 搭建私有docker仓库

    安装docker yum install docker 启动docker systemctl start docker 拉取registry镜像 docker pull registry 创建仓库配置 ...

  6. zabbix登录密码重置方法

    注:由于账号较多,难免忘记账号,下面是找回zabbix登录密码的过程. 一.登录zabbix数据库 [root@123 ~]# mysql -uroot -p密码 二.修改zabbix密码 mysql ...

  7. LINUX-APT 软件工具 (Debian, Ubuntu 以及类似系统)

    apt-get install package_name 安装/更新一个 deb 包 apt-cdrom install package_name 从光盘安装/更新一个 deb 包 apt-get u ...

  8. WeChat-小程序-tabbar

    WeChat-小程序-tabbar https://developers.weixin.qq.com/miniprogram/dev/framework/config.html#%E5%85%A8%E ...

  9. Ural 1114 Boxes

    Boxes Time Limit: 600ms Memory Limit: 16384KB This problem will be judged on Ural. Original ID: 1114 ...

  10. java 日历计算农历和节假日的工具类

    背景 业务需求需要后端提供这样的接口,网上找了很多java代码例子,虽然功能实现了 但是不完善,特别是节日那一块儿.然后百度发现有这样的插件,但是信息也是java后端提供的非js 然后在开源js插件找 ...