暂无链接

B君的第六题

【问题描述】

丢掉幻想,准备斗争!

输入四个长度为nnn的序列ai,bi,ci,di。" role="presentation" style="position: relative;">ai,bi,ci,di。ai,bi,ci,di。a_i, b_i, c_i, d_i。

求这444序列最长公共子序列的长度。

公共子序列不需要连续。

【输入格式】

第一行一个整数n" role="presentation" style="position: relative;">nnn。

第二行n个整数表示序列aiaia_i。

第三行n个整数表示序列bibib_i。

第四行n个整数表示序列cicic_i。

第五行n个整数表示序列didid_i。

【输出格式】

一行一个整数,表示答案。

【输入样例】

5
1 2 1 2 3
1 2 3 1 2
3 1 2 1 2
1 2 1 2 1

【输出样例】

4

【数据范围】

对于100%100%100\%的数据,满足1≤n≤100001≤n≤100001 ≤ n ≤ 10000。

对于100%100%100\%的数据,1≤ai≤n,1≤bi≤n,1≤ci≤n,1≤di≤n1≤ai≤n,1≤bi≤n,1≤ci≤n,1≤di≤n1 ≤ a_i ≤ n,1 ≤ b_i ≤ n,1 ≤ c_i ≤ n,1 ≤ d_i ≤ n。

对于100%100%100\%的数据,在序列aiaia_i中,任何数字出现次数都 ≤2≤2≤ 2次。

对于100%100%100\%的数据,在序列bibib_i中,任何数字出现次数都 ≤2≤2≤ 2次。

对于100%100%100\%的数据,在序列cicic_i中,任何数字出现次数都≤2≤2 ≤ 2次。

对于30%30%30\%的数据,n≤50n≤50n ≤ 50。

对于另40%40%40\%的数据,ai,bi,ci,diai,bi,ci,dia_i, b_i, c_i, d_i为四个1,2,......,n1,2,......,n1, 2, ......, n的排列。

题解

写完O(n4)dpO(n4)dpO(n^4)dp后本来有个707070分的梦想,觉得排列肯定有妙妙的性质,两两求出最长公共子序列以后取minminmin就行了,写完了O(6nlog2n)O(6nlog2n)O(6nlog_2n)以后,随便randrandrand了组数据就把自己卡WAWAWA了。。。

梦想破灭,我太naivenaivenaive了。。。

先讲讲求两个字符串的最长公共子序列的方法,一般情况下是O(n2)O(n2)O(n^2)的,但是我们有妙妙的性质啊,题目保证每个数出现的次数为常数范围,我们就可以将一个串中的数字替换为该数字在另一个串里的出现位置的倒序序列,举个例子:

1 3 4 4 6 54 5 1 9 3 6134465451936

1\ 3\ 4\ 4\ 6\ 5\\4\ 5\ 1\ 9\ 3\ 6

我们可以将下面的串替换为:

(4 3)(6)(1)()(2)(5)(43)(6)(1)()(2)(5)

(4\ 3)(6)(1)()(2)(5)

这样,替换后的串的最长上升子序列就是原串的最长公共子序列,求解复杂度为O(nlog2n)O(nlog2n)O(nlog_2n)。

我们用相同的方法,用didid_i替换ai,bi,ciai,bi,cia_i,b_i,c_i,问题就转化成了在三个序列中求最长公共不上升子序列,我们将对应位置上的数字拆分出的序列三三组合看做一个三维的物品,那么问题就变成了四维偏序。

代码
#include<bits/stdc++.h>
using namespace std;
const int M=2e5+5;
struct sd{int op,id,a,b,c;}ope[4][M];
bool cmp1(sd a,sd b){return a.a!=b.a?a.a<b.a:(a.b!=b.b?a.b>b.b:a.c>b.c);}
bool cmp2(sd a,sd b){return a.b!=b.b?a.b<b.b:a.c>b.c;}
int a[M],b[M],c[M],d[M],mx[M],len[M],n,tot;
vector<int>pa[M],pb[M],pc[M];
void in()
{scanf("%d",&n);for(int i=1;i<=n;++i)scanf("%d",&a[i]),pa[a[i]].push_back(i);for(int i=1;i<=n;++i)scanf("%d",&b[i]),pb[b[i]].push_back(i);for(int i=1;i<=n;++i)scanf("%d",&c[i]),pc[c[i]].push_back(i);for(int i=1;i<=n;++i){scanf("%d",&d[i]);for(int ja=pa[d[i]].size()-1;ja>=0;--ja)for(int jb=pb[d[i]].size()-1;jb>=0;--jb)for(int jc=pc[d[i]].size()-1;jc>=0;--jc)ope[0][++tot]=(sd){0,tot,pa[d[i]][ja],pb[d[i]][jb],pc[d[i]][jc]};}
}
#define lb(x) (x&-x)
void clear(int x){for(;x<M;x+=lb(x))mx[x]=0;}
void add(int x,int d){for(;x<M;x+=lb(x))mx[x]=max(mx[x],d);}
int ask(int x){int ans=0;for(;x;x-=lb(x))ans=max(ans,mx[x]);return ans;}
void solve(int cot)
{for(int i=1;i<=cot;++i){if(ope[2][i].op)len[ope[2][i].id]=max(len[ope[2][i].id],ask(ope[2][i].c-1)+1);else add(ope[2][i].c,len[ope[2][i].id]);}for(int i=1;i<=cot;++i)if(!ope[2][i].op)clear(ope[2][i].c);
}
void cdq(int v,int le,int ri)
{if(le==ri)return;int mid=le+ri>>1,cot=0;cdq(v,le,mid);for(int i=le;i<=mid;++i){if(v==1)ope[v][++cot]=ope[v-1][i],ope[v][cot].op=0;else if(!ope[v-1][i].op)ope[v][++cot]=ope[v-1][i];}for(int i=mid+1;i<=ri;++i){if(v==1)ope[v][++cot]=ope[v-1][i],ope[v][cot].op=1;else if(ope[v-1][i].op)ope[v][++cot]=ope[v-1][i];}if(v==1)sort(ope[v]+1,ope[v]+1+cot,cmp1);else sort(ope[v]+1,ope[v]+1+cot,cmp2);if(v==1)cdq(v+1,1,cot);else solve(cot);cdq(v,mid+1,ri);
}
void ac()
{for(int i=1;i<=tot;++i)len[i]=1;cdq(1,1,tot);int ans=0;for(int i=1;i<=tot;++i)ans=max(ans,len[i]);printf("%d",ans);
}
int main(){in();ac();}

[2018.07.14 T3] B君的第六题相关推荐

  1. 使用Vue.js初次真正项目开发-2018/07/14

    一.组件化 使用Vue.js进行开发,按照MVVM模式,围绕数据为核心,进行开发. 开发过程根据业务和功能组件化,组件化一方面让我们开发思路更加清晰,另一方面对于数据的处理和控制变得更加简单,毕竟一个 ...

  2. 2018.07.19 仿优酷网页小项目

    时间:2018.07.19 大一下学期暑假 地点:成都-实习 项目类型:HTML+CSS仿优酷网页 制作时间:两天 网页源码: <!doctype html> <html> & ...

  3. 【跃迁之路】【530天】刻意练习系列289(2018.07.20)

    @(跃迁之路)专栏 叨叨两句 技术的精进不能只是简单的刷题,而应该是不断的"刻意"练习 该系列改版后正式纳入[跃迁之路]专栏,持续更新 一.语言练习 SQL [跃迁之路]SQL语句 ...

  4. 2018.8.14笔记

    2018.8.14笔记 setsiblingindex(idx)设置兄弟结点先后顺序时,若idx处已有结点X,则结点X及其后的所有节点后移 gc alloc,就是申请堆内存,堆内存申请无处不在,不可能 ...

  5. 2018.07.30 巴别时代

    * 项目部署更新 用符号链接 project => project1, project2 ln -s project2 project * composer自动加载机制 namespace =& ...

  6. 计算机系职教周方案,琼软院软件〔2018〕14 号:关于印发《软件工程系2018年“职业教育 活动周”活动方案》的通知...

    琼软院软件[2018]14号 海南软件职业技术学院软件工程系 关于印发<软件工程系2018年"职业教育 活动周"活动方案>的通知 各位老师: <软件工程系2018 ...

  7. 2018.11.14成立我的博客

    2018.11.14成立我的博客 转载于:https://www.cnblogs.com/zengxx/p/9957509.html

  8. 学习手记(2018/7/14~2018/7/18)——快乐纪中

    2018/7/14:普通的纪中一天 儿子兄弟表示法 将一颗多叉树转换为二叉树的方法,左子节点连原树的第一个儿子,右子节点连原树的右边的兄弟 适用范围:树形dp 数位dp常见方法 状态压缩 分类讨论 记 ...

  9. 训练日志 2018.11.14

    这周的计划是 Ford.SPFA 看完了,2-SAT 看了一半,并查集没按计划完成,但把最小生成树看了,还算可以... 下周 2-SAT.次短路径.并查集... 今晚打比赛..菜的一批...做了 4. ...

  10. 暑期训练日志----2018.8.14

    训练第16天. 上午因为百度之星的比赛,还是没法做题,看了看教练发的 DP 专栏,忽然觉得以前学的 DP 还是不够深,就跑去把之前整理的 DP 和背包九讲重新看了一遍 下午把昨天个人赛没写的两个题搞明 ...

最新文章

  1. Idea项目遇到的错误整理
  2. 「机器学习」到底需要多少数据?
  3. C# System.Timers.Timer中的坑,程序异常退出后timer依然运行问题
  4. php 树形结构实例,如果用php写树形结构?
  5. junit4和junit5_JUnit5 TestSuite替代
  6. 集合——对象数组(引用数据类型数组)
  7. 课后作业-结队编程项目进度-贪吃蛇
  8. 前端websocket获取数据后需要存本地吗_是什么让我放弃了Restful API?了解清楚后我全面拥抱GraphQL!...
  9. 基于Matlab的跨孔层析成像的最短路径法弯曲射线追踪(一)
  10. matlab2c使用c++实现matlab函数系列教程-factorial函数
  11. vue canvas动效组件插件库制作
  12. Android NDK 剥离符号信息
  13. 大数据技术原理与应用学习笔记(五)
  14. SAMBA配置 “你可能没有权限访问网络资源”的问题解决方法
  15. mysql pk nn uq b un_MYSQL_WorkBench中创建新表时对PK NN UQ B UN ZF AI的理解
  16. 1分钟反勾稽金蝶销售出库,财务开心啦,一条语句简单实用,直接替换,执行即可。...
  17. Sublime 中快速打开网页
  18. 迁移系统至固态硬盘的采坑回顾
  19. Java程序员的认证Sun Certified JAVA Programmer(SCJP)
  20. 网络显示已连接,但是无网络解决办法

热门文章

  1. 中查询每个班成绩前三_重磅 2020卫生资格中初级考试成绩今天公布了
  2. 20190613 一个SQL问题
  3. 【洛谷】 3264 [JLOI2015] 管道连接
  4. 黑马程序员——OC学习小结------成员变量以及对应的set、get方法
  5. Android获取系统ID(com.android.internal.R)
  6. 常用webservice网址
  7. Android---Textview加入Intent、表情,点击跳转Activity
  8. innodb 关键特性、缓冲池、插入缓冲、两次写
  9. ajax 跨域 提交cookie,Ajax跨域请求COOKIE无法带上的完美解决办法
  10. Bean被IoC容器销毁后还能使用吗?