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 优质题 ...
随机推荐
- Controller传值到前端页面的几种方式
一丶追加字符串传值 #region 02-追加字符串传值 /// <summary> /// 02-追加字符串传值 /// </summary> /// <returns ...
- 浅析Oracle中的不等于号
前几天碰到一个关于Oracle不等于的问题,最后搜索了一下,发现下面资料,拿来跟大家分享一下,需要的朋友可以参考下 关于Oracle中的不等于号: 在Oracle中, <> != ...
- Gym - 101670J Punching Power(CTU Open Contest 2017 最大独立集)
题目: The park management finally decided to install some popular boxing machines at various strategic ...
- 牛客网NOIP赛前集训营 提高组 第5场 T2 旅游
[题解] 我们可以发现不在最小生成树上的边一定不能多次经过,因为一条不在最小生成树上的边(u,v)的边权比最小生成树上(u,v)之间的路径更长,选择不在最小生成树上的边一定不划算. 我们还需要确定最小 ...
- 【14】AngularJS 表单
AngularJS 表单 AngularJS 表单是输入控件的集合. HTML 控件 以下 HTML input 元素被称为 HTML 控件: input 元素 select 元素 button 元素 ...
- hadoop full cluster 改为伪分布
https://hadoop.apache.org/docs/r2.7.6/hadoop-project-dist/hadoop-common/SingleCluster.html#Pseudo-Di ...
- BNUOJ 1260 Brackets Sequence
Brackets Sequence Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on PKU. Origi ...
- BNUOJ 2528 Mayor's posters
Mayor's posters Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVA. Origin ...
- Minimal string 栈 贪心
time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...
- 3、Java并发性和多线程-多线程的代价
以下内容转自http://ifeve.com/costs-of-multithreading/: 从一个单线程的应用到一个多线程的应用并不仅仅带来好处,它也会有一些代价.不要仅仅为了使用多线程而使用多 ...