Longest Common Subsequence 牛客网多校

2024-02-22 18:38

本文主要是介绍Longest Common Subsequence 牛客网多校,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

https://www.nowcoder.com/acm/contest/147/G

首先要了解LCS和LIS可以相互转换

题目保证前三个串中每个数最多出现两次 所以拿四串中数的下标和前三个串中的所有相同数的下标组成四维偏序 然后CDQ求解

但是要注意的是 用CDQ求LIS时和普通CDQ不太一样 要先处理左区间内部 再处理左区间对右区间的影响 最后处理右区间内部

比如 1 2 3 4这个例子 如果左右分别处理后再处理当前区间 答案就会是3 可以手动模拟一下

#include <bits/stdc++.h>
using namespace std;struct node
{int tp;int x;int y;int z;int id;
};node order[80010],tmp1[80010],tmp2[80010];
int pos[10010][3][2];
int book[10010],dp[80010],sum[80010];
int n,tot;bool cmpI(node n1,node n2)//
{return n1.x<n2.x;
}bool cmpII(node n1,node n2)//
{return n1.y<n2.y;
}int lowbit(int x)
{return x&(-x);
}void update(int tar,int val)
{int i;for(i=tar;i<=n;i+=lowbit(i)) sum[i]=max(sum[i],val);
}void clear(int tar)
{int i;for(i=tar;i<=n;i+=lowbit(i)) sum[i]=0;
}int query(int tar)
{int res,i;res=0;for(i=tar;i>=1;i-=lowbit(i)) res=max(res,sum[i]);return res;
}void cdqII(int l,int r)
{int m,p,q,i;if(l==r) return;m=(l+r)/2;cdqII(l,m);for(i=l;i<=r;i++) tmp2[i]=tmp1[i];sort(tmp2+l,tmp2+m+1,cmpII);sort(tmp2+m+1,tmp2+r+1,cmpII);p=l,q=m+1;while(p<=m&&q<=r){if(tmp2[p].y<tmp2[q].y){if(tmp2[p].tp==0) update(tmp2[p].z,dp[tmp2[p].id]);p++;}else{if(tmp2[q].tp==1) dp[tmp2[q].id]=max(dp[tmp2[q].id],query(tmp2[q].z-1)+1);q++;}}while(q<=r){if(tmp2[q].tp==1) dp[tmp2[q].id]=max(dp[tmp2[q].id],query(tmp2[q].z-1)+1);q++;}for(i=l;i<p;i++) if(tmp2[i].tp==0) clear(tmp2[i].z);cdqII(m+1,r);
}void cdqI(int l,int r)
{int m,i;if(l==r) return;m=(l+r)/2;cdqI(l,m);for(i=l;i<=r;i++){tmp1[i]=order[i];if(i<=m) tmp1[i].tp=0;else tmp1[i].tp=1;}sort(tmp1+l,tmp1+r+1,cmpI);cdqII(l,r);cdqI(m+1,r);
}int main()
{int i,j,val,ans;scanf("%d",&n);for(j=0;j<3;j++){memset(book,0,sizeof(book));for(i=1;i<=n;i++){scanf("%d",&val);if(!book[val]) pos[val][j][0]=pos[val][j][1]=i;else pos[val][j][1]=i;book[val]=1;}}tot=0;for(i=1;i<=n;i++){scanf("%d",&val);if(!pos[val][0][0]||!pos[val][1][0]||!pos[val][2][0]) continue;for(j=7;j>=0;j--){++tot;order[tot].tp=0;order[tot].x=pos[val][0][j&1];order[tot].y=pos[val][1][(j>>1)&1];order[tot].z=pos[val][2][(j>>2)&1];order[tot].id=tot;dp[tot]=1;}}cdqI(1,tot);ans=0;for(i=1;i<=tot;i++) ans=max(ans,dp[i]);printf("%d\n",ans);return 0;
}

 

这篇关于Longest Common Subsequence 牛客网多校的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/736150

相关文章

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

牛客小白月赛100部分题解

比赛地址:牛客小白月赛100_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ A.ACM中的A题 #include<bits/stdc++.h>using namespace std;#define ll long long#define ull = unsigned long longvoid solve() {ll a,b,c;cin>>a>>b>

牛客小白月赛100(A,B,C,D,E,F三元环计数)

比赛链接 官方讲解 这场比较简单,ABC都很签到,D是个不太裸需要预处理的 B F S BFS BFS 搜索,E是调和级数暴力枚举,F是三元环计数。三元环考的比较少,没见过可能会偏难。 A ACM中的A题 思路: 就是枚举每个边变成原来的两倍,然后看看两短边之和是否大于第三边即可。 不能只给最短边乘 2 2 2,比如 1 4 8 这组数据,也不能只给第二短边乘 2 2 2,比

笔试强训,[NOIP2002普及组]过河卒牛客.游游的水果大礼包牛客.买卖股票的最好时机(二)二叉树非递归前序遍历

目录 [NOIP2002普及组]过河卒 牛客.游游的水果大礼包 牛客.买卖股票的最好时机(二) 二叉树非递归前序遍历 [NOIP2002普及组]过河卒 题里面给的提示很有用,那个马的关系,后面就注意,dp需要作为long的类型。 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息publ

leetcode#32. Longest Valid Parentheses

题目 Given a string containing just the characters '(' and ')', find the length of the longest valid (well-formed) parentheses substring. For "(()", the longest valid parentheses substring is "()", wh

每日OJ_牛客_求和(递归深搜)

目录 牛客_求和(递归深搜) 解析代码 牛客_求和(递归深搜) 求和_好未来笔试题_牛客网 解析代码         递归中每次累加一个新的数,如果累加和大于等于目标,结束递归。此时如果累加和正好等于目标,则打印组合。向上回退搜索其它组合。此题本身就是一个搜索的过程,找到所有的组合。 #include <iostream>#include <cmath>#in

兔子--Android Studio出现错误:Error:Execution failed for task ':myapp:dexDebug'. com.android.ide.common.pro

重点在:finished with non-zero exit value 2. 这里表明了有重复的内容存在。 由于:Android Studio中引入包的方式有如下2种:    compile 'com.android.support:support-v4:22.0.0'    compile files('libs/support-v

YOLOV5入门教学-common.py文件

在 YOLOv5 框架中,common.py 文件是一个核心组件,负责定义深度学习模型的基础模块和常用操作。无论是卷积层、激活函数、特征融合还是其他复杂的模型结构,common.py 都提供了灵活且高效的实现。在这篇文章中,我们将深入解析 common.py 的设计思想、各个模块的功能以及它在 YOLOv5 中的应用。通过理解该文件的实现细节,不仅可以帮助我们更好地掌握 YOLOv5 的内部结构,

java常用算法之最长回文子串(Longest Palindromic Substring)

方法一:时间复杂度为O(n^3) public static String longestPalindrome1(String s) {int maxPalinLength = 0;String longestPalindrome = null;int length = s.length();// check all possible sub stringsfor (int i = 0; i

牛客《剑指Offer》 -- 数值的整数次方

题目描述 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 思路 特别注意负数的情况,出现负数,将其转化为正数然后求倒数。 class Solution {public:double Power(double base, int exponent) {double total = 1;bool flag = false