3 条题解

  • 0
    @ 2025-3-29 18:57:24

    #include #include #include #include using namespace std; priority_queuedgd;//大根堆 priority_queue<int,vector,greater >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; }

    • 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
        标签
        递交数
        200
        已通过
        112
        上传者