请问第一种写法有什么问题吗,蒟蒻有点迷
查看原帖
请问第一种写法有什么问题吗,蒟蒻有点迷
107689
Miss_dijkstra楼主2020/11/4 18:16

第一种有10分 第二种a了

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m;
int c[N],dp[N];
struct node
{
    int x,id,maxx,minn;
};
node a[N];
bool cmp1(node cjr,node jxx)
{
    return cjr.maxx<jxx.maxx;
}
bool cmp2(node jxx,node cjr)
{
    return jxx.x<cjr.x;
}
int lowbits(int x)
{
    return x&(-x);
}
void add(int i,int k)
{
    while(i<=n)
    {
        c[i]=max(c[i],k);
        i+=lowbits(i);
    }
}
int query(int i)
{
    int sum=-1;
    while(i>0)
    {
        sum=max(sum,c[i]);
        i-=lowbits(i);
    }
    return sum;
}
void clean(int i)
{
    while(i<=n)
    {
        c[i]=0;
        i+=lowbits(i);
    }
    return;
}
void cdq(int l,int r)
{
    if(l==r)
    {
        dp[l]=max(dp[l],1);
        return;
    }
    int mid=l+r>>1;
    cdq(l,mid);
    sort(a+l,a+1+mid,cmp1);
    sort(a+mid+1,a+r+1,cmp2);
    for(int i=mid+1,j=l;i<=r;i++)
    {
        while(a[i].x>=a[j].maxx&&j<=mid)
        {
            add(a[j].x,dp[a[j].id]);
            j++;
        }
        dp[a[i].id]=max(dp[a[i].id],query(a[i].minn)+1);
    }
    for(int i=l;i<=mid;i++)
        clean(a[i].x);
    cdq(mid+1,r);
    return;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i].x);
        a[i].maxx=a[i].minn=a[i].x;
        a[i].id=i;
    }
    for(int i=1;i<=m;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        a[x].maxx=max(a[x].maxx,y);
        a[x].minn=min(a[x].minn,y);
    }
    cdq(1,n);
    int ans=0;
    for(int i=1;i<=n;i++)
        ans=max(ans,dp[i]);
    printf("%d",ans);
}
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m;
int c[N],dp[N],val[N],maxx[N],minn[N],p[N];
bool cmp1(int i,int j)
{
    return maxx[i]<maxx[j];
}
bool cmp2(int i,int j)
{
    return val[i]<val[j];
}
int lowbits(int x)
{
    return x&(-x);
}
void add(int i,int k)
{
    while(i<=n)
    {
        c[i]=max(c[i],k);
        i+=lowbits(i);
    }
}
int query(int i)
{
    int sum=-1;
    while(i>0)
    {
        sum=max(sum,c[i]);
        i-=lowbits(i);
    }
    return sum;
}
void clean(int i)
{
    while(i<=n)
    {
        c[i]=0;
        i+=lowbits(i);
    }
    return;
}
void cdq(int l,int r)
{
    if(l==r)
    {
        dp[l]=max(dp[l],1);
        return;
    }
    int mid=l+r>>1;
    cdq(l,mid);
    for(int i=l;i<=r;i++)
        p[i]=i;
    sort(p+l,p+1+mid,cmp1);
    sort(p+mid+1,p+r+1,cmp2);
    for(int i=mid+1,j=l;i<=r;i++)
    {
        while(val[p[i]]>=maxx[p[j]]&&j<=mid)
        {
            add(val[p[j]],dp[p[j]]);
            j++;
        }
        dp[p[i]]=max(dp[p[i]],query(minn[p[i]])+1);
    }
    for(int i=l;i<=mid;i++)
        clean(val[i]);
    cdq(mid+1,r);
    return;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&val[i]);
        maxx[i]=minn[i]=val[i];
    }
    for(int i=1;i<=m;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        maxx[x]=max(maxx[x],y);
        minn[x]=min(minn[x],y);
    }
    cdq(1,n);
    int ans=0;
    for(int i=1;i<=n;i++)
        ans=max(ans,dp[i]);
    printf("%d",ans);
}

2020/11/4 18:16
加载中...