HihoCoder #1513 : 小Hi的烦恼

本文介绍了一种使用Bitset进行状态压缩的方法来解决竞赛中的排名问题,避免了传统方法带来的超时风险。通过离线处理每个考生的成绩并将其与他人比较,再在线处理这些数据,最终得出每位考生优于其的总人数。

题目链接:

https://hihocoder.com/problemset/problem/1513

题解:

论bitset的重要行。
看完题目,很明显,如果用常规的方法,每一次都进行处理。那么,很明显会超时。因此,我们可以使用状态的压缩来做这道题目。
关于Bitset的具体的用法,这里贴个链接:http://www.voidcn.com/article/p-cflemkip-cs.html
因此,我们对于每一个人每一场考试,都将比他成绩好的方法一个集合里面(离线处理),最后在对这些进行&的操作,在线处理就可以了。(最后提醒:cin,cout会超时,日常翻车。。。。。。)

代码:

#include <map>
#include <queue>
#include <cmath>
#include <cstdio>
#include <vector>
#include <bitset>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define met(a,b) memset(a,b,sizeof(a))
const int maxn = 30000+10;
#define inf 0x3f3f3f3f
int Rank[maxn][5];
int Order[maxn];
bitset<maxn> Stu[5][maxn];
bitset<maxn> res;


int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        for(int j=0;j<5;j++)
            scanf("%d",&Rank[i][j]);
    for(int i=0;i<5;i++)
    {
        for(int j=1;j<=n;j++)
            Order[Rank[j][i]]=j;
        for(int j=2;j<=n;j++)
        {
            Stu[i][Order[j]]=Stu[i][Order[j-1]];
            Stu[i][Order[j]][Order[j-1]]=1;
        }
    }
    for(int i=1;i<=n;i++)
    {
        res=Stu[0][i]&Stu[1][i]&Stu[2][i]&Stu[3][i]&Stu[4][i];
        printf("%d\n",(int)(res.count()));
    }
}
### 解决无法打开源输入文件 “i2c.h” 的问题 - **检查文件是否存在**:确认 `i2c.h` 文件确实存在于项目目录中。可以在文件资源管理器里查看项目文件夹,确认 `i2c.h` 文件是否存在。 - **检查文件路径**:若 `i2c.h` 文件不在 `oled.c` 文件的同一目录下,需在MDK - ARM中设置正确的包含路径。操作如下: - 打开MDK - ARM,右键点击项目名称,选择“Options for Target”。 - 在弹出的窗口中,选择“C/C++”选项卡。 - 在“Include Paths”一栏中,添加 `i2c.h` 文件所在的目录。例如,如果 `i2c.h` 文件位于项目目录下的 `inc` 文件夹中,那么就在“Include Paths”中添加 `./inc`。 - **检查文件名称和大小写**:在Windows系统中,文件系统对文件名大小写不敏感,但MDK - ARM编译器是区分大小写的。要确保在 `oled.c` 文件中包含 `i2c.h` 的语句里,文件名的大小写和实际文件名称一致。示例如下: ```c // 正确的包含语句 #include "i2c.h" ``` - **检查文件编码和格式**:确保 `i2c.h` 文件的编码格式是UTF - 8无BOM,避免因编码问题导致编译器无法正确读取文件。 - **重新添加文件到项目**:有时候,项目文件列表可能没有正确包含 `i2c.h` 文件。可以在MDK - ARM中右键点击项目名称,选择“Add Existing Files to Group ...”,然后重新添加 `i2c.h` 文件到项目中。 ### 解决标识符 “hi2c2” 未定义的问题 - **确认定义位置**:要保证 `hi2c2` 在某个头文件或者源文件中已经被定义。通常,在使用STM32 HAL库时,`hi2c2` 是在 `main.c` 或者 `i2c.c` 中定义的一个 `I2C_HandleTypeDef` 类型的变量。示例如下: ```c // 在 i2c.c 或者 main.c 中定义 I2C_HandleTypeDef hi2c2; ``` - **包含相关头文件**:如果 `hi2c2` 定义在某个头文件中,需要在 `oled.c` 文件中包含该头文件。例如,如果 `hi2c2` 定义在 `main.h` 中,那么在 `oled.c` 中添加如下代码: ```c #include "main.h" ``` - **检查作用域**:确保 `hi2c2` 的定义在 `oled.c` 文件中是可见的。如果 `hi2c2` 是在某个函数内部定义的,那么它的作用域仅限于该函数内部,在其他函数中是无法访问的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值