这题目意思非常easy,就是给你一个数组,然后让你又一次排好序,排序有要求的,每次仅仅能交换两个元素的位置,交换须要一个代价 就是两个元素之和,问你把数组重小到大排好最少须要多少代价





可能一開始想不到逆序数,我是专门做专题往那边想才想到的,举个样例吧

数组: 9 1 0 5 4

此时到 0 的时候,我们先手写一下最小代价,然后再依照自己的推測去看看,就是当前扫到0,那么前面比它大的数有2个,所以先 部分代价为 2 * 0,然后再加上前面比它大的数 也就是9 和1 ,那么最小代价为10,发现跟手算的一样,那么 再多试几个 最后我们就发现了





对于当前数num,前面有x个比它大的数,那么走到当前一步的 最小代价为 x*num 再加上前面比它大的数之和





这样就非常easy跟树状数组扯上关系了,当前一步的逆序数 事实上就是  前面比它大的数的个数,然后同一时候又能用树状数组对于前面比它大的数求和,这样问题就完美攻克了,一開始我看n是10^5次,可能还是没经验把,认为有可能会超,所以就先离散化的做了一遍,但是总是WA,然后离散化去掉以后就过了,不知道为什么,但是用过掉的代码跑了非常多案例,发现跟离散化版本号的 答案是一样的,真心不知道哪里写错了

离散化的贴出来,希望路过大神 指点:
#include<iostream>
#include<cstdio>
#include<list>
#include<algorithm>
#include<cstring>
#include<string>
#include<stack>
#include<map>
#include<vector>
#include<cmath>
#include<memory.h>
#include<set>
#include<cctype> #define ll long long
#define LL __int64
#define eps 1e-8 //const ll INF=9999999999999; #define inf 0xfffffff using namespace std; //vector<pair<int,int> > G;
//typedef pair<int,int> P;
//vector<pair<int,int>> ::iterator iter;
//
//map<ll,int>mp;
//map<ll,int>::iterator p; const int N = 500000 + 10; int a[N];
int aa[N];
int n; typedef struct Node {
int v;//原数字
int id;//下标
}; Node p[N]; typedef struct C {
LL sum;
int id;
}; C c[N]; void clear() {
memset(c,0,sizeof(c));
memset(aa,0,sizeof(aa));
memset(p,0,sizeof(p));
} bool cmp(Node x,Node y) {
return x.v < y.v;
} int lowbit(int x) {
return x&(-x);
}
//设原始矩阵为a,将a[i]加上val时对c所做的改动
void update(int i, int val) {
while (i <= n) {
c[i].id += val;
i += lowbit(i);
}
} void add(int i,int val) {
while(i <= n) {
c[i].sum += (1LL) * val;
i += lowbit(i);
}
} int get_sumid(int i) {
int sum = 0;
while(i > 0) {
sum += c[i].id;
i -= lowbit(i);
}
return sum;
} //求前i项元素的和
int get_sum(int i) {
int sum=0;
while (i > 0) {
sum += c[i].sum;
i -= lowbit(i);
}
return sum;
} int main() {
while(scanf("%d",&n) == 1) {
clear();
//先离散操作
for(int i=1;i<=n;i++) {
scanf("%d",&p[i].v);
a[i] = p[i].v;
p[i].id = i;//循环序号必须从1開始
}
sort(p + 1,p + n + 1,cmp);
for(int i=1;i<=n;i++)
aa[p[i].id] = i;//aa数组存了原来大小信息
LL ans = 0;
for(int i=1;i<=n;i++) {
update(aa[i],1);
add(a[i],a[i]);
int ans1 = i - get_sumid(aa[i]);//i代表当前已经插入的个数,ge_sum(aa[i])代表比aa[i]小的数个数,减去即为大的个数,即逆序数
if(ans1 != 0) {
LL ans2 = (1LL) * get_sum(n) - (1LL) * get_sum(a[i]);
ans += (1LL) * ans1 * a[i] + ans2;
}
}
printf("%I64d\n",ans);
}
return 0;
}

AC代码:

#include<iostream>
#include<cstdio>
#include<list>
#include<algorithm>
#include<cstring>
#include<string>
#include<stack>
#include<map>
#include<vector>
#include<cmath>
#include<memory.h>
#include<set>
#include<cctype> #define ll long long
#define LL __int64
#define eps 1e-8 //const ll INF=9999999999999; #define inf 0xfffffff using namespace std; //vector<pair<int,int> > G;
//typedef pair<int,int> P;
//vector<pair<int,int>> ::iterator iter;
//
//map<ll,int>mp;
//map<ll,int>::iterator p; const int N = 500000 + 10; int n; typedef struct C {
LL sum;
int id;
}; C c[N]; void clear() {
memset(c,0,sizeof(c));
} int lowbit(int x) {
return x&(-x);
}
//设原始矩阵为a,将a[i]加上val时对c所做的改动
void update(int i, int val) {
int j = i;
while (i <= n) {
c[i].id += val;
c[i].sum += j;
i += lowbit(i);
}
} int get_sumid(int i) {
int sum = 0;
while(i > 0) {
sum += c[i].id;
i -= lowbit(i);
}
return sum;
} //求前i项元素的和
LL get_sum(int i) {
LL sum=0;
while (i > 0) {
sum += c[i].sum;
i -= lowbit(i);
}
return sum;
} int main() {
while(scanf("%d",&n) == 1) {
clear();
LL ans = 0;
for(int i=1;i<=n;i++) {
int x;
scanf("%d",&x);
update(x,1);
LL ans1 = i - get_sumid(x);//i代表当前已经插入的个数,ge_sum(aa[i])代表比aa[i]小的数个数,减去即为大的个数,即逆序数
if(ans1 != 0) {
LL ans2 = get_sum(n) - (1LL) * get_sum(x);
ans += ans1 * x + ans2;
}
}
printf("%I64d\n",ans);
}
return 0;
} /*
4
1 3 2 4 5
1 5 3 2 4 5
5 4 3 2 1 7
3 4 5 1 2 7 6 6
2 1 6 5 4 3 7
4 3 6 5 2 1 7 ans:
5
29
60
46
57
69
*/



HDU2838 Cow Sorting 树状数组 区间求和加逆序数的应用的更多相关文章

  1. hdu 1754 I Hate It(树状数组区间求最值)2007省赛集训队练习赛(6)_linle专场

    题意: 输入一行数字,查询第i个数到第j个数之间的最大值.可以修改其中的某个数的值. 输入: 包含多组输入数据. 每组输入首行两个整数n,m.表示共有n个数,m次操作. 接下来一行包含n个整数. 接下 ...

  2. hdu 2838 Cow Sorting 树状数组求所有比x小的数的个数

    Cow Sorting Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  3. hdu 2838 Cow Sorting (树状数组)

    Cow Sorting Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  4. LG5200 「USACO2019JAN」Sleepy Cow Sorting 树状数组

    \(\mathrm{Sleepy Cow Sorting}\) 问题描述 LG5200 题解 树状数组. 设\(c[i]\)代表\([1,i]\)中归位数. 显然最终的目的是将整个序列排序为一个上升序 ...

  5. HDU3874 /HDU3333 树状数组 区间求不重复数和

    Necklace Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total S ...

  6. HDU Cow Sorting (树状数组)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2838 Cow Sorting Problem Description Sherlock's N (1  ...

  7. HDU 6318 Swaps and Inversions 思路很巧妙!!!(转换为树状数组或者归并求解逆序数)

    Swaps and Inversions Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  8. Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) E. Cards Sorting 树状数组

    E. Cards Sorting time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  9. hdu 4638 树状数组 区间内连续区间的个数(尽可能长)

    Group Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

随机推荐

  1. Fedora下Eclipse/MyEclipse崩溃的解决方案

    Fedora19下使用myeclipse2013时,打开不到一分钟就异常关闭. 默认在home目录下生成一个log文件,里面显示的错误信息,说是libsoup.so文件导致出错.第一个想法是删除这个文 ...

  2. Spring Boot数据库交互

    在上篇文件的基础上进行开发,简单实现一下增.查操作,删除和修改类似,作为一个demo就暂时不做重复工作了,实现原理类似 IDEA创建Spring Boot项目 项目结构 新建MySQL数据库相关信息 ...

  3. log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader).

    一.异常描述: log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLo ...

  4. Mysql安装(绿色版安装)

    一:下载 1.官网 https://dev.mysql.com/ 2.下载 3.下载 二:安装 1.将官网上下载的包进行解压 2.以管理员的身份运行DOS安装 进入mysql的bin目录 运行mysq ...

  5. 接口调用 POST

    /** * 接口调用 POST * @return [type] [description] */ public function portPhone(Request $request) { $pho ...

  6. CSUOJ 1956 数字和

    Description 长者对小明施加了膜法,使得小明每天起床就像马丁的早晨一样. 今天小明早上起来后发现身体虽然变小,头脑依旧不变变傻. 他有一条纸带,上面有n个数字,第i个数字为Ai. 他想把纸带 ...

  7. ASP.NET MVC , ASP.NET Web API 的路由系统与 ASP.NET 的路由系统是怎么衔接的?

      ASP.NET MVC 的路由实际上是建立在 ASP.NET 的路由系统之上的. MVC 路由注册通常是这样的: RouteTable 是一个全局路由表, 它的 Routes 静态属性是一个 Ro ...

  8. CSS3组件化之ios版菊花loading

    <div class="juhua-loading"> <div class="jh-circle1 jh-circle-ios">&l ...

  9. Linux嵌入式文件系统(网络文件系统)

    <文件系统定义> 怎么将文件和文件目录加载到linux内核中,这一种加载的方式就叫做文件系统 <建立根文件系统目录和文件> <创建目录> 1)在linux系统中使用 ...

  10. BZOJ 2333: [SCOI2011]棘手的操作 可并堆 左偏树 set

    https://www.lydsy.com/JudgeOnline/problem.php?id=2333 需要两个结构分别维护每个连通块的最大值和所有连通块最大值中的最大值,可以用两个可并堆实现,也 ...