KiKi's K-Number (树状数组)

本文介绍了如何利用树状数组解决HDU 2852题目——KiKi's K-Number的问题。操作包括插入、删除元素以及查询比给定数大的第k个数。树状数组可以方便地维护元素出现次数的前缀和,对于操作1,需要先判断元素是否存在再进行删除;对于操作2,采用二分查找方法逐步逼近答案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

KiKi’s K-Number  (树状数组)

HDU - 2852

题意:

题意:题目给定三种操作: 0 x 表示把x插入容器 ; 1 x 表示删除一个x如果没有x则输出 No Elment! ; 2 a k 表示比a大的数中的第k大的数 如果没有输出No Find!

思路:

​ 树状数组维护元素出现次数前缀和即可。操作0即修改;操作1先查询x是否存在,如果存在删除一个即可。操作2可以用二分逐渐逼近答案。

#include<bits/stdc++.h>
#define mset(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const ll MAXN=1e5+20;
const int MAX=100000;
int bt[MAXN];
int lowbit(int k)
{
    return k&-k;
}
void modify(int k,int val)
{
    while(k<=MAX)
    {
        bt[k]+=val;
        k+=lowbit(k);
    }
}
int getsum(int k)
{
    int ans=0;
    while(k>0)
    {
        ans+=bt[k];
        k-=lowbit(k);
    }
    return ans;
}
int clac(int a,int b)
{
    return getsum(b)-getsum(a-1);
}
int m,tot;
int main()
{
    while(~scanf("%d",&m))
    {
        mset(bt,0);
        tot=0;
        while(m--)
        {
            int sign;
            scanf("%d",&sign);
            if(sign==0)
            {
                int val;
                scanf("%d",&val);
                modify(val,1);
                tot++;
            }
            if(sign==1){
                int val;
                scanf("%d",&val);

                if(clac(val,val)==0){
                    puts("No Elment!");
                }
                else{
                    modify(val,-1);
                    tot--;
                }
            }
            if(sign==2){
                int a,k;
                scanf("%d%d",&a,&k);
                int ans=-1,l=a+1,r=MAX;
                while(l<=r){
                    int mid=(l+r)/2;
                    if(clac(a+1,mid)>=k){
                        ans=mid;
                        r=mid-1;
                    }
                    else
                        l=mid+1;
                }
                if(ans==-1){
                    puts("Not Find!");
                }
                else
                    printf("%d\n",ans);
            }
        }
    }

}

<think>我们面临两个问题:1.在编译时出现`aarch64-linux-android-gcc:notfound`错误。2.在设置环境变量时出现`export:不是有效的标识符`错误(如引用[4]所示)。###问题1:解决交叉编译工具链未找到**原因分析**:-系统无法在指定路径找到`aarch64-linux-android-gcc`编译器,可能因为:a)路径错误b)工具链未安装或安装不完整c)缺少必要的32位兼容库(在64位主机上运行32位工具链时)d)文件权限问题**解决步骤**:####1.验证工具链安装检查工具链是否存在于指定路径:```bashls/home/kiki/aarch64-linux-android-4.9-toolchain-master/bin```预期输出应包含`aarch64-linux-android-gcc`等文件。若不存在,需重新安装或下载工具链。####2.添加可执行权限若文件存在但无法执行,添加权限:```bashchmod-R+x/home/kiki/aarch64-linux-android-4.9-toolchain-master/bin```####3.安装32位兼容库(仅限x86_64主机)在64位Ubuntu/Debian系统上:```bashsudoaptinstalllibc6-i386lib32stdc++6```在CentOS/RHEL系统上:```bashsudoyuminstallglibc.i686libstdc++.i686```####4.设置环境变量临时设置(当前终端有效):```bashexportPATH="/home/kiki/aarch64-linux-android-4.9-toolchain-master/bin:$PATH"exportCROSS_COMPILE=aarch64-linux-android-exportARCH=arm64```永久设置(添加到`~/.bashrc`):```bashecho'exportPATH="/home/kiki/aarch64-linux-android-4.9-toolchain-master/bin:$PATH"'>>~/.bashrcecho'exportCROSS_COMPILE=aarch64-linux-android-'>>~/.bashrcecho'exportARCH=arm64'>>~/.bashrcsource~/.bashrc#立即生效```###问题2:修复`export:不是有效的标识符`错误**原因分析**:此错误通常由以下原因引起:-在`export`命令中使用了非法的变量名(如包含空格或特殊字符)-赋值操作符`=`周围有空格(如`exportVAR=value`)-复制粘贴时引入了不可见字符(如全角字符或制表符)**解决步骤**:1.**手动输入命令**:如引用[4]所述,避免复制粘贴,手动输入命令。2.**检查等号两边无空格**:确保`export`语法为:```bashexportPATH="/new/path:$PATH"#正确:等号两边无空格```而非:```bashexportPATH="/new/path:$PATH"#错误:等号两边有空格```3.**避免特殊字符**:路径中若包含空格,需用引号包裹整个路径。###完整配置流程假设工具链已下载到`/home/kiki/aarch64-linux-android-4.9-toolchain-master`:```bash#步骤1:设置环境变量(手动输入!)exportPATH="/home/kiki/aarch64-linux-android-4.9-toolchain-master/bin:$PATH"exportCROSS_COMPILE=aarch64-linux-android-exportARCH=arm64#步骤2:验证编译器aarch64-linux-android-gcc--version#应输出类似:aarch64-linux-android-gcc(GCC)4.9.x...#步骤3:编译内核模块cd/home/kiki/Desktop/rwProcMem_modulemake-C/home/kiki/Desktop/5.1-common/outM=$(pwd)modules```###常见问题排查表|现象|解决方案||------|----------||`bash:aarch64-linux-android-gcc:commandnotfound`|检查`PATH`是否包含工具链`bin`目录||`make:aarch64-linux-android-gcc:Nosuchfileordirectory`|安装32位兼容库或验证文件权限||`export:不是有效的标识符`|手动输入命令,确保等号无空格|>**重要提示**:AndroidNDK工具链路径区分大小写,且必须使用正斜杠`/`。###工具链兼容性说明-**AndroidNDKr10e~r19c**:GCC4.9适用于内核3.x~4.19-**AndroidNDKr20+**:默认使用Clang,需调整编译参数[^5]若问题仍未解决,建议下载预编译工具链:```bashwgethttps://releases.linaro.org/components/toolchain/binaries/4.9-2017.01/aarch64-linux-android/gcc-linaro-4.9.4-2017.01-x86_64_aarch64-linux-android.tar.xztarxvfgcc-linaro-4.9.4-2017.01-x86_64_aarch64-linux-android.tar.xzexportPATH="$(pwd)/gcc-linaro-4.9.4-2017.01-x86_64_aarch64-linux-android/bin:$PATH"```§§相关问题§§1.如何为不同的Android内核版本选择兼容的交叉编译工具链?2.在Ubuntu22.04上配置交叉编译环境时有哪些常见依赖需要安装?3.交叉编译Linux内核模块时如何处理"Functionnotimplemented"错误?</think>### 解决交叉编译环境配置问题 #### 问题1: `aarch64-linux-android-gcc: not found` 错误 **原因分析**: 1. 工具链路径配置错误 2. 编译器文件缺失或权限问题 3. 缺少必要的32位兼容库(64位系统上) **解决步骤**: 1. **验证工具链安装路径**: ```bash ls /home/kiki/aarch64-linux-android-4.9-toolchain-master/bin ``` 检查输出是否包含 `aarch64-linux-android-gcc` 文件 2. **设置正确的环境变量**: ```bash # 手动输入路径(避免复制粘贴错误) export PATH="/home/kiki/aarch64-linux-android-4.9-toolchain-master/bin:$PATH" export CROSS_COMPILE=aarch64-linux-android- export ARCH=arm64 ``` 3. **添加可执行权限**: ```bash chmod +x /home/kiki/aarch64-linux-android-4.9-toolchain-master/bin/aarch64-linux-android-* ``` 4. **安装32位兼容库**: ```bash # Ubuntu/Debian sudo apt install libc6-i386 lib32stdc++6 # CentOS/RHEL sudo yum install glibc.i686 libstdc++.i686 ``` 5. **验证编译器可用性**: ```bash aarch64-linux-android-gcc --version ``` 正常应显示编译器版本信息 #### 问题2: `export: 不是有效的标识符` 错误 **原因分析**: 1. 路径中包含非法字符(如全角字符、空格) 2. 复制粘贴时引入不可见字符 3. 等号两边有空格 **解决步骤**: 1. **手动输入命令**(如引用[4]所述): ```bash # 正确格式(等号两边无空格) export PATH="/home/kiki/aarch64-linux-android-4.9-toolchain-master/bin:$PATH" ``` 2. **检查路径中的特殊字符**: ```bash echo "/home/kiki/aarch64-linux-android-4.9-toolchain-master/bin" | cat -A ``` 输出中不应有 `^M`(回车符)或全角字符 3. **使用引号包裹路径**: ```bash # 当路径含空格时 export PATH="/path/with spaces/bin:$PATH" ``` 4. **永久添加到.bashrc**: ```bash echo 'export PATH="/home/kiki/aarch64-linux-android-4.9-toolchain-master/bin:$PATH"' >> ~/.bashrc source ~/.bashrc ``` ### 完整的交叉编译环境配置流程 ```bash # 1. 设置环境变量(手动输入!) export ARCH=arm64 export CROSS_COMPILE=aarch64-linux-android- export PATH="/home/kiki/aarch64-linux-android-4.9-toolchain-master/bin:$PATH" # 2. 验证配置 echo "ARCH: $ARCH" echo "CROSS_COMPILE: $CROSS_COMPILE" which aarch64-linux-android-gcc # 3. 编译内核模块 cd ~/Desktop/rwProcMem_module make -C /home/kiki/Desktop/5.1-common/out M=$(pwd) modules ``` > **重要提示**:避免从网页或文档直接复制命令,手动输入可防止不可见字符引入错误[^4]。 ### 工具链路径验证要点 | 检查项 | 正确示例 | 错误示例 | |-------|---------|---------| | 路径分隔符 | `/home/user/toolchain/bin` | `\home\user\toolchain\bin` | | 等号格式 | `PATH="/path/bin:$PATH"` | `PATH = "/path/bin:$PATH"` | | 前缀格式 | `CROSS_COMPILE=aarch64-linux-android-` | `CROSS_COMPILE=aarch64-linux-android-gcc` | | 文件权限 | `-rwxr-xr-x` | `-rw-r--r--` | ### 常见问题排查 1. **仍报`not found`错误**: ```bash # 检查文件是否存在 file /home/kiki/aarch64-linux-android-4.9-toolchain-master/bin/aarch64-linux-android-gcc # 检查ELF头信息 readelf -h /home/kiki/aarch64-linux-android-4.9-toolchain-master/bin/aarch64-linux-android-gcc ``` 2. **兼容性问题**: - 旧版内核(<4.0)使用 GCC 4.9 - 新版内核(≥5.0)建议使用 Clang 或 GCC 10+
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值