5204: [CodePlus 2018 3 月赛]投票统计
题目:传送门
题解:
谢谢niang老师的一道sui题
离散化之后直接搞啊(打完之后还错了...)
代码:
1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std; 7 int T; 8 struct node 9 { 10 int x,y,id; 11 }a[110000],b[110000];int s[110000],ans[110000],A[110000]; 12 bool v[110000]; 13 bool cmp(node n1,node n2){return n1.x<n2.x;} 14 int main() 15 { 16 scanf("%d",&T); 17 while(T--) 18 { 19 int n,m=0;scanf("%d",&n); 20 for(int i=1;i<=n;i++)scanf("%d",&a[i].x),a[i].y=i; 21 for(int i=1;i<=n;i++)b[i]=a[i]; 22 sort(b+1,b+n+1,cmp); 23 b[1].id=1; 24 for(int i=2;i<=n;i++) 25 { 26 if(b[i].x!=b[i-1].x)b[i].id=b[i-1].id+1; 27 else b[i].id=b[i-1].id; 28 } 29 for(int i=1;i<=n;i++)a[b[i].y].id=b[i].id,m=max(m,b[i].id); 30 for(int i=1;i<=n;i++)ans[a[i].id]=a[i].x;memset(s,0,sizeof(s)); 31 int maxx=0;for(int i=1;i<=n;i++)s[a[i].id]++,maxx=max(s[a[i].id],maxx);int len=0; 32 for(int i=1;i<=m;i++)if(s[i]==maxx)A[++len]=ans[i]; 33 if(len==m)printf("-1 "); 34 else 35 { 36 printf("%d ",len); 37 for(int i=1;i<len;i++)printf("%d ",A[i]); 38 printf("%d ",A[len]); 39 } 40 } 41 return 0; 42 }