//每个数字只会被它后面的比它小的数字影响,且会向右移动相应个数的位置
//比如: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;
}
}

最新文章

  1. Blogging with github Pages
  2. Entity Framework 6 with MySql
  3. libevent源码分析:eventop
  4. MySQL5:性能优化
  5. java线程详解(一)
  6. C# Albert工程阅读关键字解析
  7. OC基础(8)
  8. Git push 时每次都需要密码的疑惑
  9. 统计中的PV,UV是的意思(转)
  10. textarea&#160;在浏览器中固定大小和禁止拖动
  11. ORACLE模拟一个数据文件坏块并使用RMAN备份来恢复
  12. Servlet 实现文件的上传与下载
  13. 深入浅出WPF——附加事件(Attached Event)
  14. v-bind特性
  15. STL - miltimap(可重映射)
  16. Squid实现正向代理及访问控制--技术流ken
  17. java list 去重
  18. Compile groovy mixed with java in Maven
  19. 给 Advice 传递参数
  20. DBWritable的使用

热门文章

  1. create-react-app 打包后静态文件过大 webpack优化
  2. javascript 完全正确的数据库indexedDB
  3. 《自拍教程5》Python自动化测试学习思路
  4. 编写windows服务程序
  5. 数据分析之pandas库--series对象
  6. docker容器互联,实现目录、服务共享
  7. KVM管理工具webvirtmgr的使用
  8. Spring(七)核心容器 - 钩子接口
  9. 为什么我不建议在C#中用下划线_开头来表示私有字段
  10. pikachu-远程代码、命令执行漏洞(RCE)