C-排队
链接:https://atcoder.jp/contests/arc133/tasks/arc133_b?lang=en
来源:AtCoder Regular Contest 133
题目描述


样例一
输入
输出
样例二
输入
输出
样例三
输入
1 2 3
| 10 4 3 1 10 9 2 8 6 5 7 9 6 5 4 2 3 8 10 1 7
|
输出
算法描述
本题使用LIS(2)(最长上升子序列)算法求解
首先求出在数组b中所有a[i]的倍数的下标全部存子入链表中,再对子链表进行从大到小排序(这一步很关键,因为从大到小排序在进行寻找最长上升子序列时才能正确的找寻到结果)
笔者代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
| import java.util.*; import java.io.*; public class Main{ static Scanner sc = new Scanner(new BufferedInputStream(System.in)); static int sc(){return sc.nextInt();}
static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); static final int N = (int)2e5+10,P = 131,MOD = (int)1e9+7; static int n; static int[] a = new int[N]; static int[] b = new int[N]; static int[] h = new int[N]; static int INF= 0x3f3f3f3f;
public static void main(String[] args) throws Exception{ n = sc(); for(int i = 1;i<=n;i++){a[i]=sc();} for(int i = 1;i<=n;i++){ b[i]=sc(); h[b[i]] = i; } List<Integer> list = new ArrayList(); int len=0; int[] dp = new int[N]; dp[0] = 0; for(int i = 1;i<=n;i++){ list.addAll(find(a[i])); } for(int i = 0;i<list.size();i++){ int l=0,r = len; while(l<r){ int mid = l+r+1>>1; if(list.get(i)>dp[mid]){ l = mid; }else{ r = mid-1; } } len = Math.max(len,r+1); dp[r+1] = list.get(i); } out.println(len); out.close(); } public static List<Integer>find(int num){ List<Integer> list = new ArrayList(); for(int k = 1;k*num<=n;k++){ list.add(h[num*k]); } Collections.sort(list,(o1,o2)->o2-o1); return list; } }
|