POJ 2299 Ultra-QuickSort
2016-04-12 12:55
471 查看
题目大意就是要求数组中逆序数的对数,和51nod1019一样,可以用树状数组。
先对所有数进行排序,还要记录每个数原来在数组中的下标,在排好序的数组中,从小到大依次访问,假设访问到第i个数,用树状数组查询1~i-1的数中原始下标小于等于k的个数(k是第i个数的原始下标)。
同时动态更新树状数组。
先对所有数进行排序,还要记录每个数原来在数组中的下标,在排好序的数组中,从小到大依次访问,假设访问到第i个数,用树状数组查询1~i-1的数中原始下标小于等于k的个数(k是第i个数的原始下标)。
同时动态更新树状数组。
#include<iostream> #include<algorithm> #include<cstring> using namespace std; int C[500005],n; int lowbit(int x) { return x&-x; } int sum(int x) //求前缀和,x向左上爬 { int ret=0; while(x>0) { ret+=C[x]; x-=lowbit(x); } return ret; } void add(int x,int d) //A[x]加上d,x向右上爬 { while(x<=n) { C[x]+=d; x+=lowbit(x); } } struct D { int id; long long val; }; bool operator < (D a,D b) { return a.val<b.val; } D data[500005]; int main() { while(cin>>n&&n) { long long ans=0; for(int i=1; i<=n; i++) { cin>>data[i].val; data[i].id=i; } sort(data+1,data+n+1); data[0].val=-111; memset(C,0,sizeof(C)); int pre; for(int i=1; i<=n; i++) { if(data[i].val!=data[i-1].val) { pre=sum(n)-sum(data[i].id); ans+=pre; } else ans+=pre; add(data[i].id,1); } cout<<ans<<endl; } }
相关文章推荐
- valuestack,stackContext,ActionContext.之间的关系以及action的数据在页面中取得的方法
- UGUI研究院之判断鼠标或者手指是否点击在UI上
- Android Exception: Build failed,unaligned.apks 拒绝访问
- easyUI的datagrid每行数据添加操作按钮的方法
- iOS中break、continue、return三者的区别
- IOS的UI基础01
- HDU 5288 OO's sequence (2015多校第一场 二分查找)
- AndroidUI——后台线程更新UI的几种方式
- AndroidUI——PopupWindow焦点问题
- Android:android.database.sqlite.SQLiteConstraintException:UNIQUE constraint failed
- IOS开发-UI学习-sqlite数据库的操作
- 限制UITextField输入长度
- hdu-1530-Maximum Clique-找最大团
- select, iocp, epoll,kqueue及各种I/O复用机制
- RA layer request failed
- Unique Paths II
- IOS 关于取消延迟执行函数的种种。performSelector与cancelPreviousPerformRequestsWithTarget
- 一个 forceLayout() 和 requestLayout() 的测试
- iOS UITextField 限制输入长度,中英文混排,汉字占2个长度,英文数字占1个长度
- 缺陷跟踪工具jira和团队协作与项目管理工具conflunce