HDU 1394 Minimum Inversion Number(单点更新 + 求逆序数)
来源:互联网 发布:掐指算法 编辑:程序博客网 时间:2024/05/14 03:21
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394
利用线段树求出当前序列的逆序数,然后O(1)的时间就可以求出每次操作后序列的逆序数。
代码如下。
#include <iostream>#include <iomanip>#include <cstdio>#include <algorithm>#include <cmath>#include <queue>#include <vector>#include <stack>#include <string>#include <cstring>#include <cassert>using namespace std;typedef long long ll;const int maxn=5005;const int INF=0x7fffffff;const int mod=1e7+7;#define LSON l,m,rt<<1#define RSON m+1,r,rt<<1|1#define ESP 1e-7int sum[maxn<<2],num[maxn];void pushup(int rt){ sum[rt]=sum[rt<<1]+sum[rt<<1|1];//每个节点存该区间已经输入的数字属于该区间的个数}void build(int l,int r,int rt){ sum[rt]=0; if(l==r) return ; int m=(l+r)>>1; build(LSON); build(RSON);}void update(int p,int l,int r,int rt){ if(l==r){ sum[rt]++; return ; } int m=(l+r)>>1; if(p<=m) update(p,LSON); else update(p,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=(l+r)>>1,ans=0; if(L<=m) ans+=query(L,R,LSON); if(R>m) ans+=query(L,R,RSON); return ans;}int main(){ int n; while(~scanf("%d",&n)){ build(0,n-1,1); int ss=0;//记录初始序列逆序数个数 for(int i=0;i<n;i++){ scanf("%d",&num[i]); ss+=query(num[i],n-1,0,n-1,1);//对每次输入一个数后,查询已经输入的数字中比该数字的大的个数,即由该数字组成的逆序数个数 update(num[i],0,n-1,1); } int an=ss; for(int i=0;i<n;i++){ ss+=n-num[i]-1-num[i];//当将第一个数放到最后时,总的逆序数个数=比它大的数-由它组成的逆序数个数. an=min(an,ss);//记录最小的逆序数个数 } printf("%d\n",an); } return 0;}
0 0
- hdu 1394 Minimum Inversion Number(线段树之 单点更新求逆序数)
- HDU 1394 Minimum Inversion Number (线段树 单点更新 求逆序数)
- HDU 1394 Minimum Inversion Number(单点更新 + 求逆序数)
- HDU 1394 Minimum Inversion Number(线段树:单点更新,求逆序数)
- [HDU]1394 Minimum Inversion Number (树状数组--单点更新,区间查询 求逆序数)
- Hdu 1394 Minimum Inversion Number 单点更新,成段求逆序数
- HDU 1394 Minimum Inversion Number 线段树 单点更新 求逆序数
- HDU 1394 Minimum Inversion Number (求逆序数)
- HDU 1394 Minimum Inversion Number(求最小逆序数)
- HDU 1394 Minimum Inversion Number 线段树求逆序数
- hdu 1394 Minimum Inversion Number 线段树求逆序数
- 线段树求逆序数 hdu 1394 Minimum Inversion Number
- HDU 1394 Minimum Inversion Number【线段树求逆序数】
- hdu 1394 Minimum Inversion Number 归并求逆序数
- HDU 1394- Minimum Inversion Number(线段树求逆序数)
- HDU 1394 Minimum Inversion Number (树状数组求逆序数)
- HDU 1394 Minimum Inversion Number // 线段树求逆序数
- HDU 1394 Minimum Inversion Number(线段树求逆序数)
- Trie树 poj3630
- 头文件定义全局变量
- Java设计模式——合成模式(Composite)
- 搜索引擎的效果图
- MyFirstDemo
- HDU 1394 Minimum Inversion Number(单点更新 + 求逆序数)
- #个人赛第三场解题总结#
- BZOJ 2947 Poi2000 促销 set
- js获取url参数值的两种方式详解
- sendToTarget与sendMessage
- 项目四 用类解决关于图书馆的书的问题
- Problem F 字符串替换
- list
- HDU 2795 Billboard(单点更新)