Bubble Sort HDU - 5775 树状数组
2024-10-08 09:45:25
//每个数字只会被它后面的比它小的数字影响,且会向右移动相应个数的位置
//比如:6 4 3 5 2 1 。4后面比它小的有 三个,因此它的最右边位置就是当前位置 +3,即5
//如果该数字本身在标准位置左边,那无须考虑,初始位置就是最左端
//如果它在标准位置右边,我们可以知道,它最终肯定要回到标准位置,所以最左边应该为标准位置。
#include<iostream>
#include<cstring>
using namespace std;
const int N=;
int a[N];
int ans[N];
int tr[N];
int cnt;
int lowbit(int x)
{
return x&-x;
}
void add(int x,int p)
{
for(int i=x;i<=N;i+=lowbit(i))
tr[i]+=p;
}
int sum(int x)
{
int res=;
for(int i=x;i;i-=lowbit(i))
res+=tr[i];
return res;
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
memset(a,,sizeof a);
memset(ans,,sizeof ans);
memset(tr,,sizeof tr);
//输入初始的位置
for(int i=;i<=n;i++)
cin>>a[i];
for(int i=n;i;i--)
{
//从后往前
//比这个数小的
int res=sum(a[i]);
//如果该数字本身在标准位置左边,那无须考虑,初始位置就是最左端
ans[a[i]]=res;
//插入该数字到标准位置
add(a[i],);
}
//初始位置在标准位置右边,最左端为标准位置,更新|left - right|
//a[i]应该在a[i]的位置,但是现在的位置是i,且i>=a[i],说明在标准位置的右边
//那么最左端就是标准位置,
for(int i=;i<=n;i++)
if(i>=a[i])
ans[a[i]]+=(i-a[i]);
cout<<"Case #"<<++cnt<<":";
for(int i=;i<=n;i++)
cout<<" "<<ans[i];
cout<<endl;
}
}
最新文章
- Blogging with github Pages
- Entity Framework 6 with MySql
- libevent源码分析:eventop
- MySQL5:性能优化
- java线程详解(一)
- C# Albert工程阅读关键字解析
- OC基础(8)
- Git push 时每次都需要密码的疑惑
- 统计中的PV,UV是的意思(转)
- textarea&#160;在浏览器中固定大小和禁止拖动
- ORACLE模拟一个数据文件坏块并使用RMAN备份来恢复
- Servlet 实现文件的上传与下载
- 深入浅出WPF——附加事件(Attached Event)
- v-bind特性
- STL - miltimap(可重映射)
- Squid实现正向代理及访问控制--技术流ken
- java list 去重
- Compile groovy mixed with java in Maven
- 给 Advice 传递参数
- DBWritable的使用