比赛记录

注意随机数据 ,1-n排列这种,一般都有啥暴力重构之类的方法,期望重构次数很少之类的

1005也是这样,因为n^2但只有n个值有数,所以就可以n^2logn

题解


1001 Salty Fish

unsolved.

1002 Nonsense Time 

 https://blog.csdn.net/liufengwei1/article/details/98785302

代码:

#include<bits/stdc++.h>
#define maxl 50010
using namespace std;
 
int n,mxid,mxval;
int a[maxl],kk[maxl],dy[maxl],ans[maxl];
int b[maxl],dp[maxl],frm[maxl];
bool in[maxl],froz[maxl];
 
inline void prework()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]),dy[a[i]]=i;
    for(int i=1;i<=n;i++)
        scanf("%d",&kk[i]),froz[i]=false;
}
 
inline void upd(int i,int x)
{
    while(i<=n)
    {
        if(dp[b[i]]<dp[x])
            b[i]=x;
        i+=i&-i;
    }
}
 
inline int qry(int i)
{
    int res=0;
    while(i)
    {
        if(dp[res]<dp[b[i]])
            res=b[i];
        i-=i&-i;
    }
    return res;
}
 
inline void lis()
{
    for(int i=1;i<=n;i++)
        in[i]=false,frm[i]=0,b[i]=0,dp[i]=0;
    int id;mxval=0;mxid=0;
    for(int i=1;i<=n;i++)
    if(!froz[i])
    {
        id=qry(a[i]);
        dp[i]=dp[id]+1;frm[i]=id;
        if(dp[i]>mxval)
            mxval=dp[i],mxid=i;
        upd(a[i],i);
    }
    int u=mxid;
    while(u!=0)
        in[u]=true,u=frm[u];
}
 
inline void mainwork()
{
    lis();
    for(int i=n;i>=1;i--)
    {
        ans[i]=mxval;
        froz[kk[i]]=true;
        if(in[kk[i]])
            lis();
    }
}
 
inline void print()
{
    for(int i=1;i<=n;i++)
        printf("%d%c",ans[i],(i==n)?'\n':' ');
}
 
int main()
{
    int t;
    scanf("%d",&t);
    for(int i=1;i<=t;i++)
    {
        prework();
        mainwork();
        print();
    }
    return 0;
}
View Code

相关文章:

  • 2021-12-05
  • 2022-01-25
  • 2021-09-14
  • 2021-11-24
  • 2021-09-10
  • 2021-05-29
  • 2021-08-08
  • 2021-07-12
猜你喜欢
  • 2022-03-05
  • 2022-12-23
  • 2021-11-06
  • 2021-08-30
  • 2021-11-25
  • 2022-01-21
相关资源
相似解决方案