hdu1394(线段树求逆序对)
2024-10-10 21:12:42
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1394
线段树功能:update:单点增减 query:区间求和
分析:如果是0到n-1的排列,那么如果把第一个数放到最后,对于这个数列,逆序数是减少a[i],而增加n-1-a[i]的,所以每次变化为res+=n-a[i]-1-a[i].
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
#define maxn 5555
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
int sum[maxn<<];
int a[maxn];
void PushUp(int rt)
{
sum[rt]=sum[rt<<]+sum[rt<<|];
}
void build(int l,int r,int rt)
{
sum[rt]=;
if(l==r)
return;
int m=(r+l)>>;
build(lson);
build(rson);
}
void update(int pos,int l,int r,int rt)
{
if(r==l)
{
sum[rt]++;
return;
}
int m=(r+l)>>;
if(pos<=m)update(pos,lson);
else update(pos,rson);
PushUp(rt);
}
int Query(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R)
{
return sum[rt];
}
int m=(r+l)>>;
int res=;
if(L<=m)res+=Query(L,R,lson);
if(m<R)res+=Query(L,R,rson);
return res;
}
int main()
{
int n;
while(scanf("%d",&n)>)
{
build(,n-,);
int sum=;
for(int i=;i<n;i++)
{
scanf("%d",&a[i]);
sum+=Query(a[i],n-,,n-,);
update(a[i],,n-,);
}
int ans=sum;
for(int i=;i<n;i++)
{
sum+=n-a[i]-a[i]-;
ans=min(ans,sum);
}
printf("%d\n",ans);
}
return ;
}
树状数组求逆序对更简单。。。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
#define maxn 5555
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
int a[maxn],c[maxn];
int n;
int lowbit(int x)
{
return x&(-x);
}
int sum(int i)
{
int res=;
while(i)
{
res+=c[i];
i-=lowbit(i);
}
return res;
}
void update(int i,int x)
{
while(i<=n)
{
c[i]+=x;
i+=lowbit(i);
}
}
int main()
{
while(scanf("%d",&n)>)
{
int res=;
memset(c,,sizeof(c));
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
a[i]++;
res+=i--sum(a[i]);//求1~a[i]区间的出现的数,再总(i-1)-sum(a[i])即可
update(a[i],);//单点更新
}
int ans=res;
for(int i=;i<=n;i++)
{
res+=n-a[i]-(a[i]-);
ans=min(ans,res);
}
printf("%d\n",ans);
}
}
最新文章
- HA-0302 退役
- 16 IO操作文件读写
- 1.3 迭代器 - iterator
- Kinect for Windows SDK开发初体验(一)环境配置
- 详细解析Java中抽象类和接口的区别
- POJ 2486 Apple Tree(树形DP)
- StartSSL免费证书申请笔记
- Libvirt 虚拟化库剖析
- JDBC(用Eclipse操作数据库Oracle)的基础操作集合
- poj 3323 Matrix Power Series (矩阵乘法 非递归形式)
- .NET框架及C#语言基础
- 控制结构(5) 必经之地(using)
- Devstack: A copy of worked local.conf I&#39;m sharing with you.
- (转)InFluxDB数据库使用手册
- lombok插件:Data自动get/set方法, Slf4j实现Logger的调用
- laravel 连表查询数据库
- python globals和locals
- ThinkPHP 5.x远程命令执行漏洞分析与复现
- PL/SQL编程基础——PL/SQL简介
- RockBrain USB Server- 云计算虚拟化USB设备集中管理、远程共享解决方案(涉及银企直联)
热门文章
- css3 动画运动路径
- [置顶] 用mootools实现checkbox全选功能
- VC++实现位图显示透明效果--实现原理
- 深入探讨MFC消息循环和消息泵
- CAS (1) —— Mac下配置CAS到Tomcat(服务端)(转)
- 修改Hosts文件
- Hibernate @Embeddable注解
- Swift - 控制流/控制结构说明(if,switch,for,while)
- ruby语言仅仅是昙花一现
- 条款38 通过复合塑膜出has-a或&;quot;依据某物实现&;quot;