关于set O(nlogn)求LIS WA

P1439 【模板】最长公共子序列

02Ljh @ 2022-12-11 14:16:25

emm 先把问题转换为LIS 然后思路是用set二分求LIS 结果WA 20pts 求调

思路同这题的set二分 是不是做法假了

#include <bits/stdc++.h>
using namespace std;
#define MAXN 100019
#define INF 0x3f3f3f3f
#define WA puts("CCF");
int b[MAXN];
int mapp[MAXN];
int dp[MAXN];
int n;
struct lxy
{
    int pos,val;
    bool operator <(const lxy &x)const
    {
        if(x.val==val) return x.pos<pos;
        return x.val<val;
    }
};
set<lxy> q;
set<lxy>::iterator r;
void pu(int pos_,int val_)
{
    lxy temp;
    temp.pos=pos_;
    temp.val=val_;
    q.insert(temp);
    return ;
}
int main()
{
    //freopen("P1439_4.in","r",stdin);
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int l;
        cin>>l;
        mapp[l]=i;
    }
    bool flag=false;
    for(int i=1;i<=n;i++)
    {
        int l;
        cin>>l;
        b[i]=mapp[l];
        //cout<<b[i]<<" ";
        if(b[i]!=i) flag=true;
    }
    if(!flag)
    {
        cout<<n;
        return 0;
    }
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        //cout<<ans<<"\n";
        dp[i]=1;
        if(q.empty()) { ans=max(ans,1); pu(i,b[i]); continue; }
        lxy temp;
        temp.pos=i;
        temp.val=b[i];
        r=q.lower_bound(temp);
        while(1)
        {
            temp=*r;
            if(temp.val>b[i]) --r;
            else break;
        }
        int need=temp.val,max1=0;
        while(need==temp.val)
        {
            //cout<<need<<"=="<<temp.val<<"->"<<temp.pos<<"\n";
            max1=max(dp[temp.pos],max1);
            if(temp.pos==1) { break; }
            --r;
            temp=*r;
        }
        max1=max(max1,dp[temp.pos]);
        dp[i]=max1+1;
        ans=max(ans,dp[i]);
        pu(i,b[i]);
    }
    //for(int i=1)
    cout<<ans;
    /*
    dp[i]
    */
    return 0;
}
/*
84751352
*/

|