排序_纪中1386_bzoj4552_树状数组
来源:互联网 发布:淘宝模特拍摄价格 编辑:程序博客网 时间:2024/06/05 08:18
Description
你收到一项对数组进行排序的任务,数组中是1到N个一个排列。你突然想出以下一种特别的排序方法,分为以下N个阶段:
•阶段1,把数字1通过每次交换相邻两个数移到位置1;
•阶段2,用同样的方法把N移到位置N;
•阶段3,把数字2移到位置2处;
•阶段4,把数字N-1移到位置N-1处;
•依此类推。
换句话说,如果当前阶段为奇数,则把最小的未操作的数移到正确位置上,如果阶段为偶数,则把最大的未操作的数移到正确位置上。
写一个程序,给出初始的排列情况,计算每一阶段交换的次数。
Input
第一行包含一个整数N(1<=N<=100000),表示数组中元素的个数。
接下来N行每行一个整数描述初始的排列情况。
Output
输出每一阶段的交换次数。
Hint
[数据范围]
70%的数据N<=100
题解
对于每一个点用0和1标记是否排过序
因为每次交换只会置换未排序的项,于是问题就转变成了求向前或向后有多少数字还未排序,也就是1的个数
树状数组可以求区间和,线段树也行
硬是没想到正解,优美的暴力过70分。
代码/pas
var n:longint; a,f,t:array[0..100000]of int64;procedure add(x,y:longint);begin while x<=n do begin f[x]:=f[x]+y; x:=x+(x and(-x)); end;end;function get(x:longint):longint; begin get:=0; while x>0 do begin get:=get+f[x]; x:=x-(x and(-x)); end;end;procedure init;var i:longint;begin readln(n); for i:=1 to n do begin read(a[i]); t[a[i]]:=i; add(i,1); end;end;procedure main;var i,ans,g:longint;begin for i:=1 to n do begin ans:=0; if i mod 2=1 then begin g:=(i+1)div 2; ans:=get(t[g]-1); add(t[g],-1); end else begin g:=n-(i-1)div 2; ans:=get(n)-get(t[g]); add(t[g],-1); end; writeln(ans); end;end;begin init; main;end.
2 0
- 排序_纪中1386_bzoj4552_树状数组
- 排序 纪中 1386 树状数组/玄学
- 绕圈跑_纪中2930_树状数组统计
- poj1990 树状数组+排序
- 模板_树状数组(BIT)
- ACM_模板_树状数组
- ACM_模板_树状数组
- 郁闷的记者_纪中1386_拓扑排序
- poj2481之排序+树状数组
- 小朋友排序(树状数组)
- 【冒泡排序】树状数组 & 结论
- hdu 1166 _ 树状数组版
- hdu 1166_线段树&树状数组
- HDU_1394_线段树_树状数组
- LA4329乒乓比赛_树状数组
- 树状数组_应用的代码
- HDU_3450_Counting Sequences_树状数组_离散化
- codevs 1080_线段树练习_树状数组
- ListView的优化
- 1058. A+B in Hogwarts (20)
- java程序之源——主函数
- 第十章 Project Setup and Window Initialization
- 推荐一个视频放慢软件(应急用)
- 排序_纪中1386_bzoj4552_树状数组
- Linux-VIM使用
- Android抽象布局——include、merge 、ViewStub
- Java数组
- 第4章第1节练习题7 交换二叉树所有节点左右子树
- 单链表的创建、插入、删除、销毁以及查找中间结点
- PHP按照 年、月、日创建递归目录
- 随机选择案例
- 博客进入前1万名了