PAT-TOP 1010. Lehmer Code (35)
2016-03-13 12:30
429 查看
2016.3.12的浙大PAT顶级第二题。
题目链接
题目大意:
给出n个互不相同的数{a1,a2...an},要求一个长度是n的序列{l1,l2...ln},li表示在{ai~an}中有li个数比ai要小。
解题思路:
把这n个数映射到区间[1,n],设a[i]是映射后的数组,然后从后往前遍历这n个数,先用Sum(a[i])求到这个数加入前,区间[1,a[i]]已经有多少个数了(就是题目要求的li),再用Add(a[i],1)把这个数加到树状数组里。
代码:
题目链接
题目大意:
给出n个互不相同的数{a1,a2...an},要求一个长度是n的序列{l1,l2...ln},li表示在{ai~an}中有li个数比ai要小。
解题思路:
把这n个数映射到区间[1,n],设a[i]是映射后的数组,然后从后往前遍历这n个数,先用Sum(a[i])求到这个数加入前,区间[1,a[i]]已经有多少个数了(就是题目要求的li),再用Add(a[i],1)把这个数加到树状数组里。
代码:
#include<cstdio> #include<algorithm> #include<iostream> using namespace std; struct node { int val,id; }p[100005]; int a[100005],ans[100005],c[100005],n;//a是映射后的数组,ans是要求的数组,c是用于保存树状数组的数组,n是数的个数,也是树状数组的上界 bool cmp(node a,node b) { return a.val<b.val; } int lowbit(int x) { return x&(-x); } int Sum(int x) { int ans=0; while(x>0) { ans+=c[x]; x-=lowbit(x); } return ans; } void Add(int x,int val) { while(x<=n) { c[x]+=val; x+=lowbit(x); } } int main() { int i; scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&p[i].val); p[i].id=i; } sort(p+1,p+n+1,cmp); for(i=1;i<=n;i++) a[p[i].id]=i; for(i=n;i>=1;i--) { ans[i]=Sum(a[i]); Add(a[i],1); } printf("%d",ans[1]); for(i=2;i<=n;i++) printf(" %d",ans[i]); puts(""); return 0; }
相关文章推荐
- Hadoop搭建
- linux磁盘分区、文件系统创建与挂载
- 网站开发时间计划表
- 什么界面架构最好?
- error opening trace file: No such file or directory (2)报错原因
- tabhost 通过popup跳转activity
- .Net程序员学习Linux最简单的方法
- Shell 操作(三)——举例
- Linux内核分析——跟踪分析Linux内核的启动过程
- 20135316王剑桥Linux内核学习笔记第三周
- crontab——Linux 下的定时任务
- OpenCV学习笔记_用指针操作图像元素
- mac自带的sed和linux不一致, 需要安装gnu-sed
- linux及安全第三周总结——跟踪分析LINUX内核的启动过程
- Linux内核分析 NO.3
- shell sed替换、删除文件中的某个字符串
- linux内核分析第三周
- 基于日志数据的网站架构
- hibernate查询语句正确,查询不到数据问题
- linux中c/c++连接mysql示例程序