2 条题解
-
0赵青海 (huhe) LV 7 SU @ 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; }
-
-12022-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
- 标签
- 递交数
- 190
- 已通过
- 102
- 上传者