Laoj P1659 noip模拟 - 道路规划(LCS的nlogn算法)


试题描述

吉丽王国有n个城市,每个城市有两个“附属城市”,其中北部有n个城市,每个城市的编号都是1~n中的一个,且互不相同,南部的n个城市也是如此。
很遗憾,南北两边的城市之间还没有道路连接,这个南北交通运输带来了很大的麻烦。
国王吉丽设计规划了一种方案,决定先建n条道路,即编号相同的两个城市之间连上一条道路

如图所示,这就是建完道路后的样子。
如果第i个城市和第j个城市的两条道路相交了,那么我们称这两个城市“平等互惠”
吉丽想找出一个城市集合,使得集合中的任意两个城市都“平等互惠”,吉丽还希望这个集合的大小尽可能大。
那最大是多少呢,请你回答他。

输入格式

第一行,一个整数,n。
第二行,n个整数,第i个数表示北部第i个城市的编号。
第三行,n个整数,第i个数表示南部第i个城市的编号。

输出格式

输出合法的城市集合的最大大小。

输入示例

5
1 4 5 2 3
3 4 2 1 5


输出示例

3


注释说明

【样例解释】
{1,3,4},{1,2,3}和{2,3,5}都是合法的方案,大小是3,显然是最大值。

【数据规模】
对于20%数据,n<=50;
对于50%数据,n<=500;
对于70%数据,n<=5000;
对于100%数据,n<=10^5。

【分析】

一开始的想法是先预处理然后求个lis之类的,也算靠了点边。

后来发现把第二个序列翻转后,取二者的lcs即可,数据范围10^5,明显留给nlogn的。

LCS的nlogn算法其实就是把LCS转成LIS,LIS的nlogn算法想必大家都会了。

怎么转化呢,举个栗子:

比如样例数据是1 4 5 2 3和3 4 2 1 5,第二个序列翻转后为5 1 2 4 3,用c[i]来表示第一个序列的第i个数在第二个序列中的位置。

此时c[5]={4, 2, 5, 3, 1},现在再对c数组求LIS就可以了。

注意,要求是集合中任意两个城市都为“平等互惠”,如果我们求出来LCS=1的话,这个集合就为空。

【代码】

 1 #include <bits/stdc++.h>
 2 #define inf 0x7fffffff
 3 using namespace std;
 4
 5 int n, a[100005], b[100005], c[100005], x, g[100005], ans, k, f[100005];
 6
 7 void init() {
 8     cin >> n;
 9     for (int i=1;i<=n;++i)
10         scanf("%d", &a[i]);
11     for (int i=n;i>0;--i)  {
12         scanf("%d", &x);
13         b[x]=i;
14     }
15     for (int i=1;i<=n;++i)
16         c[i]=b[a[i]];
17 }
18
19 void lis() {
20     for (int i=1;i<=n;++i)
21         g[i]=inf;
22     for (int i=1;i<=n;++i) {
23         k=lower_bound(g+1, g+n+1, c[i])-g;
24         g[k]=c[i];
25         f[i]=k;
26         ans=max(ans, f[i]);
27     }
28 }
29
30 int main() {
31     init();
32     lis();
33     if (ans!=1)
34         cout << ans << endl;
35     else
36         cout << 0 << endl;
37 }
时间: 2024-11-08 21:06:59

Laoj P1659 noip模拟 - 道路规划(LCS的nlogn算法)的相关文章

NOIP模拟17.8.17

NOIP模拟17.8.17 A 小 G 的字符串文件名 输入文件 输出文件 时间限制 空间限制str.pas/c/cpp str.in str.out 1s 128MB[题目描述]有一天,小 L 给小 G 出了这样一道题:生成一个长度为 n 的.全由小写英文字母构成的字符串,只能使用 k 种字母.要求满足:• 字符串中相邻的两个字母不能相同.• 必须出现恰好 k 种不同的字母.这样的合法字符串可能有很多,小 L 让小 G 输出字典序最小的那个.小 G 太笨啦,不会做这道题,希望你帮帮他.[输入格

[BZOJ入门OJ2092][Noip模拟题]舞会

2092: [Noip模拟题]舞会 Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 9  Solved: 5 [Submit][Status][Web Board] Description 学校举行舞会啦,一共有N个人参加,所有人站成一排,从左开始编号,最左边的人编号为1 ,最右边的为N.每个人跳舞的熟练度我们用一个整数表示,第i个人的熟练度为Ai,每次熟 练度最接近的一对相邻男女会出列跳舞,如果有多对那么最左边的那一对会先出列,请你给 出出列跳

【简单思考】noip模拟赛 NTR酋长

NTR酋长 (ntr.pas/.c/.cpp) 黄巨大终于如愿以偿的进入了czy的后宫中……但是czy很生气……他要在黄巨大走到他面前的必经之路上放上几个NTR酋长来阻挡黄巨大. 众所周知,NTR酋长有一个技能是沟壑(F).它会在地图上产生一条长长的障碍物阻挡人前进.Czy打算在一个n*m的矩形(必经之路?)中放上NTR酋长.NTR酋长要一个一个放下去,而且每放一个都会向四角倾斜的方向放出无限长的沟壑,而已经被沟壑挡住的地方就不能再放NTR酋长了. 请注意:不会出现沟壑的路径挡住另一个沟壑的情况

【noip模拟赛】 射击

这题似乎是什么安阳一中的模拟题,不管了,反正是学长出的noip模拟赛里面的题目.... 射击(shoot.pas/.c/.cpp) 时间限制:1s,内存限制128MB 题目描述: 据史书记载,对越反击战时期,有位中国侦察兵,他的代号叫814.一天他执行狙击任务,他的任务地区是n座恰巧在一条直线上的山.这些山所在直线恰巧为东西走向,山从东到西依次编号为1~n.一天814隐藏在编号为k的山上,每座山上都有1个目标. 814也非常的厉害,任务结束时杀了很多人,可是史书中只记载了两点: 1:814一定攻

NOIP模拟赛

#1[Nescafé 31]杯NOIP模拟赛 t1 题意:n*m的棋盘上从(1,1)走到(n,m),只能向下或向右,一些格子有老鼠,每个老鼠互不相同,当处于与老鼠有重边的格子时,视为看见了这只老鼠,求到终点看到最少的不同老鼠数. 分析:DP 由于求得是看到的不同的老鼠数目,不能直接用过河卒做,因为同一个位置的老鼠可能会统计多次,我们还需要增加一维即方向. f[i,j,0]表示到从上面一个格子走到(i,j)时最少老鼠数,f[i,j,1]表示左边. f[i,j,0]:=min(f[i-1,j,0]+

NOIP模拟 17.8.18

NOIP模拟17.8.18 A.小菜一碟的背包[题目描述]Blice和阿强巴是好朋友但萌萌哒Blice不擅长数学,所以阿强巴给了她一些奶牛做练习阿强巴有 n头奶牛,每头奶牛每天可以产一定量的奶,同时也需要一定量的草作为饲料对于第 i头奶牛来说,它每天可以产 vi升的奶,同时需要 wi千克的草作为饲料现在来自蚯蚓国的九条可怜想借一些奶牛,使借走的这些奶牛每天的总产奶量最大,但九条可怜很穷,每天最多只能提供W千克的草作为饲料,而且她还需要对付跳蚤国的神刀手,所以她把这个问题交给了阿强巴,不不不……阿

NOIP模拟 6.28

NOIP模拟赛6.28 Problem 1 高级打字机(type.cpp/c/pas) [题目描述] 早苗入手了最新的高级打字机.最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧. 请为这种高级打字机设计一个程序,支持如下3种操作: 1.T x:在文章末尾打下一个小写字母x.(type操作) 2.U x:撤销最后的x次修改操作.(Undo操作) (注意Query操作并不算修改操作) 3.Q x:询问当前文章中第x个字母并输出.(Query操作) 文章一开始可以视为空串. [输入格式]

NOIP模拟17.9.21

NOIP模拟17.9.21 1 任务安排manage.in/.out/.cpp1.1 问题描述你有N 个工作,同一时刻只能做一个任务, 其中每个工作有其所需时间, 及完成的Deadline(截止时间), 问要完成所有工作, 最迟要从什么时候开始.你最早可以从时间0 开始工作.1.2 输入格式第一行一个整数N,表示任务数量接下来n 行,每行两个整数,Ti; Si,分别表示该任务的持续时间和截止时间.1.3 输出格式输出一个整数,表示最晚的开始时间,如果不能完成,输出-1.1.4 样例输入43 58

NOIP模拟赛 6.29

2017-6-29 NOIP模拟赛 Problem 1 机器人(robot.cpp/c/pas) [题目描述] 早苗入手了最新的Gundam模型.最新款自然有着与以往不同的功能,那就是它能够自动行走,厉害吧. 早苗的新模型可以按照输入的命令进行移动,命令包括‘E’.‘S’.‘W’.‘N’四种,分别对应东南西北.执行某个命令时,它会向对应方向移动一个单位.作为新型机器人,它可以执行命令串.对于输入的命令串,每一秒它会按命令行动一次.执行完命令串的最后一个命令后,会自动从头开始循环.在0时刻时机器人