题目描述

没有选上课的孩子,或者还有?”“救救孩子……”

又又又到了选修课抢课的时间了!集训队成员全心备战亚洲区域赛,居然忘记了选课. 

缓过神来的集训队成员现在很想知道,每门课人数从小到大的排序结果是什么. 

Wty主席这时微微一笑,早已看穿了一切. 

他早就实时爬取了每一个学生所选的课程列表,现在只需要简单的统计就行了! 

你能帮帮他们吗? 

输入描述:

第一行两个正整数N,M,其中N<=1e4,M<=1e4,课程从1-M编号,
接下来N行,
每行一开始为一个非负整数K,表示该学生选课数量,接下来一行内有K个不同的正整数ai表示每个学生所选的课程编号,
其中0<=K<=10 ,1<=ai
<=M

输出描述:

M行,每行两个数字,分别代表课程编号与课程人数,
相同人数的,课程编号小的先输出
示例1

输入

3 3
1 1
3 1 2 3
2 2 3

输出

1 2
2 2
3 2

说明

所有课程的人数都一样,于是按照课程编号输出

#include<bits/stdc++.h>
using namespace std;
 
int n,m;
inline int Rd() {
     
    int x=0;
    char ch=getchar();
    while(ch<'0'||ch>'9') ch=getchar();
    while(ch>='0'&&ch<='9') {
        x=x*10+ch-'0';
        ch=getchar();
    } return x;
}                                                //这我不知道为什么大家read都要用这个函数    
//好我现在知道了,这就是传说中的快读。。比scanf和cin都快。。我还不怎么理解,我先记住
struct Course{ int date,cho; }a[10001]; //结构体用来储存编号和课程人数 inline bool cmp(Course A,Course B) { return A.cho==B.cho?A.date<B.date:A.cho<B.cho; } //这个cmp函数简直神了,我大概解释一下,就是如果AB人数相等就编号小的排前面,如果不相等就人数少的排前面 int main() { register int i,j,k; int tmp; n=Rd(),m=Rd(); for(i=1;i<=m;++i) a[i].date=i; for(i=1;i<=n;++i) { k=Rd();
 for(j=1;j<=k;++j)
        tmp=Rd(),++a[tmp].cho;

    }
         
    sort(a+1,a+1+m,cmp);                //sort函数从a[1]开始,所以用a+1
     
    for(i=1;i<=m;++i)
    printf("%d %d\n",a[i].date,a[i].cho);
    return 0;
}

注一下:上面register int 中register 表示使用cpu内部寄存器(中央处理器内的组成部分)的变量,而平时的int是把变量放在内存中,存到寄存器中可以加快变量的读写速度

数据较大的时候(比如1e8)就可以用register,原则上跟>> 按位与 按位或这种好像差不多…

尼玛。。这代码 我自己试了一下 很多神坑啊
比如我第一次试的时候。。死活通不过 发现cmp函数的()里面变量用错了。。有结构体的时候必须用结构体struct A,struct B,我一开始用了int i,int j,然后就废了
第二次,我复制了原来代码稍微改了一下,发现cin cout 好像不行啊???
 for(j=1;j<=k;++j)
        tmp=Rd(),++a[tmp].cho;

但是这一段代码。。就这一段代码,我一开始真的没发现,居然是逗号!!逗号!!

而且我换成分号就提示tmp没初始化,而且答案也是错的 一改回逗号就对了???

posted on 2019-01-08 12:21  Lyrix  阅读(414)  评论(0编辑  收藏  举报