HDU 5200

 恩。。。。看了题解之后不知道线段树应该怎么实现,由于后面附了更简便的方法,所以好像没有看到用线段树实现的题解QAQ。。想知道。。。

然后仔细看了最后的题解,发现………………自己刚开始写的就差一点点就可以优化了嘛QAQ!摔!每次对比的时候只看前后的位置是否有树,所以只要比对这两个就好了啊。。。然后就不用再用队列来存放那些加进来的树了。。。虽然自己在写之前算过复杂度。。但是。。。貌似忘了考虑每次后移的n^2的时间。。。。华丽丽的T。。。

这是之前的版本:

#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
#define maxn 51000
struct node
{
    int val;
    int pos,vis;
}a[maxn],q[maxn],que[maxn];
int ans[maxn];
int cmp(node a,node b)
{
    if(a.val==b.val) return a.pos>b.pos;
    return a.val>b.val;
}
int erfen(int l,int r,int x)
{
    int mid=(l+r)>>1;
    while(l<r)
    {
        if(que[mid].pos<x) l=mid+1;
        else r=mid;
        mid=(l+r)>>1;
    }
    return mid;
}
void print(node *a,int len)
{
    for(int i=0;i<len;i++) printf("%d ",a[i].val);printf("\n");
}
int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        int i,j,k;
        for(i=0;i<n;i++) {scanf("%d",&a[i].val);a[i].vis=0;a[i].pos=i;}
        sort(a,a+n,cmp);
        for(i=0;i<m;i++) {scanf("%d",&q[i].val);q[i].pos=i;que[i].vis=0;}
        sort(q,q+m,cmp);
        i=0;
        int num=0;
        int top=0;
      //  print(a,n);print(q,m);  //debug
        for(k=0;k<m;k++)
        {
            while(a[i].val>q[k].val&&i<n)
            {
                j=erfen(0,top,a[i].pos);//printf("pos is %d\n",j);

                int tmp=a[i].pos;
                
                if(j==0)
                {
                    if(tmp==que[j].pos-1) que[j].vis=a[i].vis=1;
                }
                else if(j==top) {if(tmp==que[j-1].pos+1) que[j].vis=a[i].vis=1;}
            else if(tmp==que[j].pos-1&&tmp==que[j-1].pos+1) {num--;que[j-1].vis=que[j].vis=a[i].vis=1;}
                
                if(!a[i].vis) num++;
                for(int p=top;p>j;p--) que[p]=que[p-1];
                que[j]=a[i];
                top++;
            //    printf("a[%d]=%d q[%d]=%d\n",i,a[i].val,k,q[k].val);  //debug
                i++;
            }
      //      for(i=0;i<top;i++) printf("%d ",que[i].pos);printf("\n");  //debug
            ans[q[k].pos]=num;
        }
        for(i=0;i<m;i++) printf("%d\n",ans[i]);
    }
    return 0;
}

这是AC的:(顿觉MAP大法好)

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
#define maxn 50100
struct node
{
    int val,pos;
}a[maxn],q[maxn];
int ans[maxn];
int cmp(node x,node y)
{
    if(x.val==y.val) return x.pos<y.pos;
    return x.val>y.val;
}
int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        int i;
        map<int,int> match;
        for(i=0;i<n;i++) {scanf("%d",&a[i].val);a[i].pos=i;match[i]=0;}
        sort(a,a+n,cmp);
        for(i=0;i<m;i++) {scanf("%d",&q[i].val);q[i].pos=i;}
        sort(q,q+m,cmp);
        int num=0;
        int st=0;
        //cout<<"sort a:"<<endl;for(i=0;i<n;i++) cout<<a[i].val<<" ";cout<<endl;
        //cout<<"sort q:"<<endl;for(i=0;i<m;i++) cout<<q[i].val<<" ";cout<<endl;
        for(i=0;i<m;i++)
        {
            //cout<<"a[st]="<<a[st].val<<endl;
            while(a[st].val>q[i].val&&st<n)
            {
                num++;
                if(match[a[st].pos+1]==1||match[a[st].pos-1]==1) num--;
                if(match[a[st].pos+1]==1&&match[a[st].pos-1]==1) num--;
                match[a[st].pos]=1;//printf("pos=%d val=%d\n",a[st].pos,a[st].val);
                st++;
              //  printf("***%d",num);
            }//printf("\n");
            ans[q[i].pos]=num;//printf("num=%d\n",num);
        }
        for(i=0;i<m;i++) printf("%d\n",ans[i]);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值