HDU多校第六场 1002 Nonsense Time —— LIS删点

阅读: 评论:0

HDU多校第六场  1002  Nonsense Time —— LIS删点

HDU多校第六场 1002 Nonsense Time —— LIS删点

题目链接:点我啊╭(╯^╰)╮

题目大意:

    长度为 n n n 的排列 p p p,一开始全部冻结
    每次永久释放 p k i p_{k_{i}} pki​​
    求每次释放之后的 L I S LIS LIS

解题思路:


    要查找 x x x 是否在 L I S LIS LIS 中,考虑用树状数组维护
    树状数组 t [ i ] t[i] t[i] 记录的是每个点 L I S LIS LIS 的位置,而不是值

核心:期望 L I S LIS LIS,树状数组维护位置

#include<bits/stdc++.h>
#define rint register int
#define deb(x) cerr<<#x<<" = "<<(x)<<'n';
using namespace std;
typedef long long ll;
const int maxn = 4e5 + 5;
int T, n, a[maxn], k[maxn], ans[maxn];
int l[maxn], r[maxn], used[maxn];
int t[maxn], f[maxn], pre[maxn]; inline int lb(int x){return x & -x;
}inline void update(int x, int p){for(int i=x; i<=n; i+=lb(i))if(f[t[i]] < f[p]) t[i] = p;
}inline int query(int x){int ret = 0;for(int i=x; i; i-=lb(i))if(f[t[i]] > f[ret]) ret = t[i];return ret;
}inline void lis(){for(int i=0; i<=n+1; i++) t[i] = f[i] = used[i] = 0;for(int i=r[0]; i<=n+1; i=r[i]){int q = query(a[i]);f[i] = f[q] + 1;pre[i] = q;update(a[i], i);}for(int i=n+1; i; i=pre[i]) used[i] = 1;
}int main() {scanf("%d", &T);while(T--){scanf("%d", &n);a[n+1] = n + 1;for(int i=1; i<=n; i++) scanf("%d", a+i);for(int i=1; i<=n; i++) scanf("%d", k+i);for(int i=0; i<=n+1; i++) l[i] = i-1, r[i] = i+1;lis();for(int i=n; i; i--){ans[i] = f[n+1] - 1;l[r[k[i]]] = l[k[i]];r[l[k[i]]] = r[k[i]];if(used[k[i]]) lis();}for(int i=1; i<=n; i++) printf("%d%c", ans[i], i<n ? ' ' : 'n');}
}

本文发布于:2024-01-31 16:19:32,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170668917429810.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:第六场   HDU   LIS   Time   Nonsense
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23