首页 技术 正文
技术 2022年11月19日
0 收藏 977 点赞 4,122 浏览 1582 个字

  题目大意

    上下有两个长度为n、位置对应的序列A、B,其中数的范围均为1~n。若abs(A[i]-B[j]) <= 4,则A[i]与B[j]间可以连一条边。现要求在边与边不相交的情况下的最大的连边数量。n <= 10^5。

  在Gold里,此题的数据范围是1000,我们完全可以用简单的最长公共连续子序列的DP方法来做。

  范围大了之后,可以观察到对于一个数A[i],它所能转移的状态最多只有9个,那么就可以顺序扫描A数组,设F[i][j]表示当前连得最后一条边为(A[i],B[to[i][j]])的最优解。to[i][j]即A[i]能转移到的B[i]的位置(顺序从小到大)。建立一棵线段树,表示最后连的边中的数B在B数组的位置时,所能得到的最优解。F[i][j]就可以直接logn查询,logn把F[i][j]更新到线段树中。

  

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>using namespace std;const int maxn = ;
int n, a[maxn], b[maxn];
int f[maxn][], cnt[maxn], to[maxn];
int adj[maxn][];
struct Tree
{
int maxv[maxn*];
Tree()
{
memset(maxv, , sizeof(maxv));
}
void pushup(int rt)
{
maxv[rt] = max(maxv[rt<<], maxv[(rt<<)+]);
}
void update(int rt, int l, int r, int p, int d)
{
if (l == r)
{
maxv[rt] = max(maxv[rt], d);
return ;
}
int mid = (l+r)>>;
if (p <= mid)
update(rt<<, l, mid, p, d);
else
update((rt<<)+, mid+, r, p, d);
pushup(rt);
}
int query(int rt, int l, int r, int L, int R)
{
if (L <= l && r <= R)
return maxv[rt];
int mid = (l+r)>>, ret = ;
if (L <= mid)
ret = max(ret, query(rt<<, l, mid, L, R));
if (R > mid)
ret = max(ret, query((rt<<)+, mid+, r, L, R));
return ret;
}
}T;int main()
{
freopen("nocross.in", "r", stdin);
freopen("nocross.out", "w", stdout);
scanf("%d", &n);
for (int i = ; i <= n; ++i)
scanf("%d", &a[i]);
for (int i = ; i <= n; ++i)
scanf("%d", &b[i]), to[b[i]] = i;
for (int i = ; i <= n; ++i)
{
int l = a[i]-, r = a[i]+;
if (l < )
l = ;
if (r > n)
r = n;
cnt[i] = ;
for (int j = l; j <= r; ++j)
adj[i][++cnt[i]] = to[j];
sort(adj[i]+, adj[i]+cnt[i]+);
}
for (int i = ; i <= n; ++i)
{
for (int j = ; j <= cnt[i]; ++j)
if (adj[i][j]- >= )
f[i][j] = T.query(, , n, , adj[i][j]-)+;
else
f[i][j] = ;
for (int j = ; j <= cnt[i]; ++j)
if (adj[i][j]- >= )
T.update(, , n, adj[i][j], f[i][j]);
}
printf("%d\n", T.maxv[]);
return ;
}

  

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,088
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,564
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,412
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,185
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,822
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,905