2 条题解

  • 0
    @ 2021-8-7 18:35:25

    C++ :

    #include<iostream>
    #include<cstdio>
    #include<queue>
    #include<vector>
    using namespace std;
    priority_queue<int>dgd;//大根堆
    priority_queue<int,vector<int>,greater<int> >xgd;//小根堆
    int main()
    {
      int p,m,count;
      scanf("%d",&p);
      while(p--)
      {
        while(dgd.size())
          dgd.pop();//清空
        while(xgd.size())
          xgd.pop();//清空
        int x,cnt=0;
        scanf("%d%d",&count,&m);
        printf("%d %d\n",count,m/2+1);
        for(int i=0;i<m;i++)
        {
          
          scanf("%d",&x);
          if(xgd.empty())
            xgd.push(x);
          else
          {
            if(x>xgd.top())
              xgd.push(x);
            else
              dgd.push(x);
            while(xgd.size()<dgd.size())
            {
              xgd.push(dgd.top());
              dgd.pop();
            }
            while(xgd.size()>dgd.size()+1)
            {
              dgd.push(xgd.top());
              xgd.pop();
            }
          }
          if((i+1)&1)
          {
            cnt++;
            printf("%d ",xgd.top());
            if(!(cnt%10))
              printf("\n");
          }
        }
        printf("\n");
      }
      return 0;
    }
    
    
    • -1
      @ 2022-10-15 19:43:41
      #include<cstring>
      #include<algorithm>
      #define  N  11000
      using  namespace  std;
      struct  fuck
      {
      	int  x,y;
      }a[N];
      inline  bool  cmp(fuck  x,fuck  y){return  x.x<y.x;}
      struct  node
      {
      	int  l,r,x/*权值*/;
      }b[N];
      void  del(int  x)
      {
      	b[b[x].l].r=b[x].r;
      	b[b[x].r].l=b[x].l;
      }
      int  n,be[N];
      int  list[N],top;
      int  main()
      {
      	int  T;scanf("%d",&T);
      	while(T--)
      	{
      		top=0;
      		int  t;scanf("%d%d",&t,&n);
      		for(int  i=1;i<=n;i++)
      		{
      			scanf("%d",&a[i].x);
      			a[i].y=i;
      			b[i].l=i-1;b[i].r=i+1;
      		}
      		sort(a+1,a+n+1,cmp);
      		for(int  i=1;i<=n;i++)be[a[i].y]=i,b[i].x=a[i].x;//确定其在链表中的位置 
      		int  ans=n/2+1,l=n/2/*左边有多少个数字*/,r=n/2/*右边有多少个数字*/;
      		for(int  i=n;i>=1;i--)//按顺序删除 
      		{
      			if(i%2==1)
      			{
      				if(l<r)
      				{
      					ans=b[ans].r;l++;r--;
      				}
      				else  if(l>r)
      				{
      					ans=b[ans].l;l--,r++;
      				}
      				list[++top]=b[ans].x;
      			}
      			if(be[i]==ans)//刚好卡在中位数的位置
      			{
      				if(l>r)ans=b[ans].l,l--,r++;
      				else  if(l<=r)ans=b[ans].r,l++,r--;
      			}
      			if(be[i]>ans)r--;
      			else  l--;
      			del(be[i]);
      		}
      		//后面就是输出的问题了。
      		printf("%d %d\n",t,n/2+1);
      		int  now=0;
      		for(int  i=top;i>=1;i--)
      		{
      			now++;
      			if(now>10)
      			{
      				now-=10;
      				printf("\n");
      			}
      			printf("%d",list[i]);
      			if(now!=10)printf(" ");
      		}
      		printf("\n");
      	}
      	return  0;
      }
      
      
      • 1

      信息

      ID
      18
      时间
      1000ms
      内存
      128MiB
      难度
      3
      标签
      递交数
      187
      已通过
      99
      上传者