UVa 10635 (LIS+二分) Prince and Princess
题目的本意是求LCS,但由于每个序列的元素各不相同,所以将A序列重新编号{1,2,,,p+1},将B序列重新编号,分别为B中的元素在A中对应出现的位置(没有的话就是0)。
在样例中就是A = {1 7 5 4 8 3 9},B = {1 4 3 5 6 2 8 9}
重新编号以后:
A = {1 2 3 4 5 6 7}, B = {1 4 6 3 0 0 5 7}(里面的0在求LIS时可以忽略)
这样求A、B的LCS就转变为求B的LIS
求LIS用二分优化,时间复杂度为O(nlogn)
第一次做的用二分求LIS的题是HDU 1025
http://www.cnblogs.com/AOQNRMGYXLMV/p/3862139.html
在这里再复习一遍
//#define LOCAL
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int maxn = * ;
int num[maxn], s[maxn], dp[maxn]; int main(void)
{
#ifdef LOCAL
freopen("10635in.txt", "r", stdin);
#endif int T, kase;
scanf("%d", &T);
for(kase = ; kase <= T; ++kase)
{
int N, p, q, x;
scanf("%d%d%d", &N, &p, &q);
memset(num, , sizeof(num));
for(int i = ; i <= p+; ++i)
{
scanf("%d", &x);
num[x] = i;
}
int n = ;
for(int i = ; i <= q+; ++i)
{
scanf("%d", &x);
if(num[x])
s[n++] = num[x];
}
//求s[1]...s[n]的LIS
dp[] = s[];
int len = ;
for(int i = ; i <= n; ++i)
{
int left = , right = len;
while(left <= right)
{
int mid = (left + right) / ;
if(dp[mid] < s[i])
left = mid + ;
else
right = mid - ;
}
dp[left] = s[i];
if(left > len)
++len;
} printf("Case %d: %d\n", kase, len);
}
return ;
}
代码君
大白书里面用到了lower_bound函数
函数介绍
lower_bound()返回一个 iterator 它指向在[first,last)标记的有序序列中可以插入value,而不会破坏容器顺序的第一个位置,而这个位置标记了一个大于value 的值。
效果是一样的
//#define LOCAL
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int INF = ;
const int maxn = * ;
int num[maxn], s[maxn], g[maxn], d[maxn]; int main(void)
{
#ifdef LOCAL
freopen("10635in.txt", "r", stdin);
#endif int T, kase;
scanf("%d", &T);
for(kase = ; kase <= T; ++kase)
{
int N, p, q, x;
scanf("%d%d%d", &N, &p, &q);
memset(num, , sizeof(num));
for(int i = ; i <= p+; ++i)
{
scanf("%d", &x);
num[x] = i;
}
int n = ;
for(int i = ; i <= q+; ++i)
{
scanf("%d", &x);
if(num[x])
s[n++] = num[x];
}
//求s[1]...s[n]的LIS
for(int i = ; i <= n; ++i)
g[i] = INF;
int ans = ;
for(int i = ; i < n; ++i)
{
int k = lower_bound(g+, g+n+, s[i]) - g;
d[i] = k;
g[k] = s[i];
ans = max(ans, d[i]);
}
printf("Case %d: %d\n", kase, ans);
}
return ;
}
代码君
UVa 10635 (LIS+二分) Prince and Princess的更多相关文章
- UVA - 10635 LIS LCS转换
白书例题,元素互不相同通过哈希转换为LIS求LCS #include<iostream> #include<algorithm> #include<cstdio> ...
- UVA - 10635 Prince and Princess LCS转LIS
题目链接: http://bak.vjudge.net/problem/UVA-10635 Prince and Princess Time Limit: 3000MS 题意 给你两个数组,求他们的最 ...
- UVA 10635 Prince and Princess—— 求LCS(最长公共子序列)转换成 求LIS(最长递增子序列)
题目大意:有n*n个方格,王子有一条走法,依次经过m个格子,公主有一种走法,依次经过n个格子(不会重复走),问他们删去一些步数后,重叠步数的最大值. 显然是一个LCS,我一看到就高高兴兴的打了个板子上 ...
- uva 10635 - Prince and Princess(LCS)
题目连接:10635 - Prince and Princess 题目大意:给出n, m, k,求两个长度分别为m + 1 和 k + 1且由1~n * n组成的序列的最长公共子序列长的. 解题思路: ...
- HDU 4685 Prince and Princess (2013多校8 1010题 二分匹配+强连通)
Prince and Princess Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Othe ...
- UVA 10653.Prince and Princess
题目 In an n * n chessboard, Prince and Princess plays a game. The squares in the chessboard are numbe ...
- 强连通+二分匹配(hdu4685 Prince and Princess)
Prince and Princess Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Othe ...
- 10635 - Prince and Princess
Problem D Prince and Princess Input: Standard Input Output: Standard Output Time Limit: 3 Seconds In ...
- UVa10653.Prince and Princess
题目连接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
随机推荐
- mybatis insert 如何返回主键
在使用ibatis插入数据进数据库的时候,会用到一些sequence的数据,有些情况下,在插入完成之后还需要将sequence的值返回,然后才能进行下一步的操作. 使用ibatis的sel ...
- HYSBZ2038 小Z的袜子(莫队算法)
今天学了一下传说中的解决离线询问不修改的一种算法.题目的意思非常简单,就是询问在一个[L,R]区间里的取两个物品,然后这两个物品颜色相同的概率.其实就是对于每种颜色i,这个区间里对应的个数cnt[i] ...
- HDU 3623 Best Cow Line, Gold(模拟,注意思路,简单)
题目 POJ 3617 和 这道题题目一样,只是范围稍稍再小一点. //模拟试试 #include<stdio.h> #include<string.h> #include&l ...
- POJ 1477
#include <iostream> #define MAXN 100 using namespace std; int _[MAXN]; int main() { //freopen( ...
- DevExpress Form那些事儿
1:设置子窗体依附父窗体 首先将父窗体的属性中 IsMdiContainer 设置为 True , 就是将窗体设置为 MDI窗体.子窗体和父窗体都是继承自RibbonForm的. 代码如下 : ...
- 关于android的分辨率
关于Android的分辨率支持,为大家翻译官方文档 看世界杯的空闲时间,翻译一下官方文档.分辨率问题是大家都很关心的(720×480会不会悲剧),而关于这个问题,android官方的文档无疑最有说服力 ...
- ExtJs之工具栏及菜单栏
先培养一下大概的感觉吧. 基本按书上都弄出来了. <!DOCTYPE html> <html> <head> <title>ExtJs</titl ...
- QTP10补丁汇总
QTP10补丁汇总 QTP_00591.EXE QTP10 调试器视图问题的补丁 QTP_00591 - Prevent QuickTest Debug Viewer Problems when Pr ...
- Gradle Goodness: Using and Working with Gradle Version
To get the current Gradle version we can use the gradleVersion property of the Gradle object. This r ...
- CF A. Xenia and Divisors
题目大意: n(为三的倍数)个数的一个序列(每个数均不大于7),找出a,b,c a能被b整除,b能被c整除,序列中的每个数都被用到. 1 2 3 4 5 6 7 只有 1 2 4 1 2 6 1 3 ...