Manthan 2011, problem: (D) Optical Experiment mark

mark 输入顺序的妙用

/******
题中两线相交情况是上面的x值的,和下面的x值大小情况相反,这样的状态可以用输入输出顺序来解决
而且这样一来会有一个性质,若a是新加入的,且a,b相交,b,c相交,则a,c相交。
用树状树状求出区间内的最大值可以省时。输入时位置要反着输,这样才可以用树状数组
*****/
#include<cstdio>
#define lowbit(x) x&-x
const int LMT=1000005;
int pos[LMT],have[LMT];
int main(void)
{
    int n,ans=0,x,dir;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&x);
        pos[x]=n-i;
    }
    for(int i=0;i<n;i++)
    {
        scanf("%d",&dir);
        x=0;
        for(int j=pos[dir]-1;j>0;j-=lowbit(j))if(x<have[j])x=have[j];
        if(ans<++x)ans=x;
        for(int j=pos[dir];j<=n;j+=lowbit(j))if(x>have[j])have[j]=x;
    }
    printf("%d",ans);
    return 0;
}


你可能感兴趣的:(Manthan 2011, problem: (D) Optical Experiment mark)