bzoj5204: [CodePlus 2018 3 月赛]投票统计(离散化+暴力)

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 }
原文地址:https://www.cnblogs.com/CHerish_OI/p/8670199.html