bzoj2253
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的更多相关文章
- 【BZOJ2253】[2010 Beijing wc]纸箱堆叠 cdq分治
[BZOJ2253][2010 Beijing wc]纸箱堆叠 Description P 工厂是一个生产纸箱的工厂.纸箱生产线在人工输入三个参数 n p a , , 之后,即可自动化生产三边边长为 ...
- BZOJ2253: [2010 Beijing wc]纸箱堆叠
题解: 其实就是求三维偏序最长链.类似于三维逆序对,我们可以用树状数组套平衡树来实现. DP方程 :f[i]=max(f[j]+1) a[j]<a[i] 我们按一维排序,另一位建立树状数组,把第 ...
- BZOJ2253 2010 Beijing wc 纸箱堆叠 CDQ分治
这题之前度娘上没有CDQ分治做法,gerwYY出来以后写了一个.不过要sort3遍,常数很大. gerw说可以类似划分树的思想优化复杂度,但是蒟蒻目前不会划分树(会了主席树就懒得去弄了). 嗯 将me ...
- bzoj2253 纸箱堆叠
题目链接 题意 求三元组的严格上升子序列 思路 先考虑暴力\(dp\)一下 for(int i = 1;i <= n;++i) for(int j = 1;j < i;++j) if(x[ ...
- bzoj2253纸箱堆叠(动态规划+cdq分治套树状数组)
Description P 工厂是一个生产纸箱的工厂.纸箱生产线在人工输入三个参数 n p a , 之后,即可自动化生产三边边长为 (a mod P,a^2 mod p,a^3 mod P) (a^4 ...
- 【BZOJ2253】纸箱堆叠 [CDQ分治]
纸箱堆叠 Time Limit: 30 Sec Memory Limit: 256 MB[Submit][Status][Discuss] Description P 工厂是一个生产纸箱的工厂. 纸 ...
- cdq分治(偏序)
偏序问题: https://www.luogu.org/blog/Owencodeisking/post-xue-xi-bi-ji-cdq-fen-zhi-hu-zheng-ti-er-fen 优质题 ...
随机推荐
- 06Oracle Database 数据类型
Oracle Database 数据类型 字符型 char(n)最大2000个字节 定长 nchar(n)最大2000个字节 变长 varchar2(n) 最大4000个字节 变长 nvarchar2 ...
- 数据库——DBUtils和连接池
第一章 DBUtils如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC开发,本案例我们讲采用apache commons组件一个成员:DBUtils.DBUtils就是JDBC的简 ...
- Appium 的xpath定位
Appium 的xpath定位 1.如果元素text是唯一的,可以通过text文本定位 //*[@text=’text文本属性’] # 定位text driver.find_element_by_xp ...
- MySQL数据导入sql文件过程中出错
错误类型: ERROR 1231 (42000): Variable 'time_zone' can't be set to the value of 'NULL' ERROR 1231 (42000 ...
- 一篇入门Express
目录 1.安装 2.Hello World 3.基础路由设置 4.高级路由设置 5.静态文件 6.中间件 7.生成器 1.安装 Express 是一个 基于 Node.js 的简洁灵活的 Web 应用 ...
- 【Python实践-8】和为S的两个数字
(剑指offer)输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 思路:选定第一个数字,然后遍历后面的数字求和并与S比 ...
- SQL Server数据库基础编程
转载,查看原文 Ø Go批处理语句 用于同时执行多个语句 Ø 使用.切换数据库 use master go Ø 创建.删除数据库 方法1. --判断是否存在该数据库,存在就删除 if (exist ...
- 腾讯云,搭建Git服务器
下载安装 git 任务时间:5min ~ 10min Git 是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. 此实验以 CentOS 7.2 x64 的系统为环境,搭建 ...
- HDU 5493 Queue
Queue Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
- mongodb shell之使用js(二)
mongodb shell之使用js(二) mongodb shell不仅是个交互式shell,还能够使用js脚本进行访问. 使用js脚本进行交互的优点与缺点 (1)无需任何驱动或语言支持: (2)方 ...