博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Minimum Inversion Number 1394(线段树法)
阅读量:5320 次
发布时间:2019-06-14

本文共 1113 字,大约阅读时间需要 3 分钟。

线段树记录区间[a,b]里面出现了多少个数字,查询时只要查询区间[x,n-1]有多少个数出现过,就知道前面有多少个数比x大,也就知道x有多少逆序数。

把一个序列最前面的数字x移到最后就会产生n-1-x-x个逆序:

x在最前时它后面有x个数(0到x-1)比x小,所以把x移到最后以后逆序数要减x个;

x在最前时它后面有n-1-x个数(x+1到n-1)比x大,所以把x移到最后以后逆序数增加n-1-x个;

所以,最前面的数字x移到最后就会新产生n-2*x-1个逆序

1 #include 
2 #include
3 #include
4 #define lson l,mid,i<<1 5 #define rson mid+1,r,i<<1|1 6 using namespace std; 7 int n; 8 int sum[5010*3]; 9 int query(int ql,int qr=n-1,int l=0,int r=n-1,int i=1)10 {11 if(ql<=l&&r<=qr) return sum[i];12 int ret=0,mid;13 mid=(l+r)>>1;14 if(ql <= mid) ret+=query(ql,qr,lson);15 if(qr > mid) ret+=query(ql,qr,rson);16 return ret;17 }18 void update(int ql,int l=0,int r=n-1,int i=1)19 {20 if(l==r) {sum[i]++;return;}21 int mid=(l+r)>>1;22 if(ql<=mid) update(ql,lson);23 else update(ql,rson);24 sum[i]=sum[i<<1]+sum[i<<1|1];25 }26 int x[5000];27 int main()28 {29 while(cin>>n)30 {31 int ret=0;32 memset(sum,0,sizeof(sum));//这里相当于建树33 for(int i=0;i

 

转载于:https://www.cnblogs.com/qijinbiao/archive/2012/08/02/2619405.html

你可能感兴趣的文章
下拉刷新
查看>>
display:inline-block 和float:left 的区别
查看>>
java 图片与文字生成PDF
查看>>
Springboot2.0入门介绍
查看>>
通道(Channel)的原理获取
查看>>
我所知道的window.location
查看>>
ajax 请求发出了,数据更改了,但是没进入success 函数 把success 换成 complete...
查看>>
web前端开发知识点较高质量的网站
查看>>
2018寒假作业_3(电梯版本二)
查看>>
sql复杂查询
查看>>
修改mysql5.7的错误日志级别
查看>>
UVA - 839 Not so Mobile
查看>>
Python考试_第一次
查看>>
[Jquery 插件]活动倒计时,可同步服务器时间,倒计时格式随意设置
查看>>
【財務会計】償却 とは
查看>>
es5和es6对象导出与导入
查看>>
关于timestamp的自动更新
查看>>
【ASP.NET MVC系列】浅谈jqGrid 在ASP.NET MVC中增删改查
查看>>
自制MVC框架的插件与拦截器基础
查看>>
hiho13周暴力求lca
查看>>