HDU2838 Cow Sorting 树状数组 区间求和加逆序数的应用
可能一開始想不到逆序数,我是专门做专题往那边想才想到的,举个样例吧
数组: 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 树状数组 区间求和加逆序数的应用的更多相关文章
- hdu 1754 I Hate It(树状数组区间求最值)2007省赛集训队练习赛(6)_linle专场
题意: 输入一行数字,查询第i个数到第j个数之间的最大值.可以修改其中的某个数的值. 输入: 包含多组输入数据. 每组输入首行两个整数n,m.表示共有n个数,m次操作. 接下来一行包含n个整数. 接下 ...
- hdu 2838 Cow Sorting 树状数组求所有比x小的数的个数
Cow Sorting Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- hdu 2838 Cow Sorting (树状数组)
Cow Sorting Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- LG5200 「USACO2019JAN」Sleepy Cow Sorting 树状数组
\(\mathrm{Sleepy Cow Sorting}\) 问题描述 LG5200 题解 树状数组. 设\(c[i]\)代表\([1,i]\)中归位数. 显然最终的目的是将整个序列排序为一个上升序 ...
- HDU3874 /HDU3333 树状数组 区间求不重复数和
Necklace Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total S ...
- HDU Cow Sorting (树状数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2838 Cow Sorting Problem Description Sherlock's N (1 ...
- HDU 6318 Swaps and Inversions 思路很巧妙!!!(转换为树状数组或者归并求解逆序数)
Swaps and Inversions Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- 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 ...
- hdu 4638 树状数组 区间内连续区间的个数(尽可能长)
Group Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
随机推荐
- Filter过滤器-JavaWeb三大组件之一
Servlet.Filter.Listener是JavaWeb的三大组件,给Web开发提供了很大的便利. 什么是Filter? Filter,过滤器.类似与生活中的净水器.空气净化器. JavaWeb ...
- thinkphp模型实例化
方法一 方法二
- B树 B+树 红黑树
B-Tree(B树) 具体讲解之前,有一点,再次强调下:B-树,即为B树.因为B树的原英文名称为B-tree,而国内很多人喜欢把B-tree译作B-树,其实,这是个非常不好的直译,很容易让人产生误解. ...
- Kubernetes之YAML文件
一.YAML 基础 YAML是专门用来写配置文件的语言,非常简洁和强大,使用比json更方便.它实质上是一种通用的数据串行化格式.后文会说明定义YAML文件创建Pod和创建Deployment. YA ...
- mysql 导出数据库命令
mysqldump --socket=/data/mysql/mysql.sock -uroot -pfanzhuo -d stat1> stat1.sql
- BFC 从了解到放弃
最近工作中我突然产生了一个想法,就如我们人类面临的终极问题一般,我从哪里来?我到哪里去?在撸代码进行CSS布局的时候,我会去想,我为什么这么做?,为什么浮动的元素要用overflow?,为什么要用cl ...
- MySQL 相关知识细节及解析
1,删除表中所有记录使用delete from 表名:还是用truncate table 表名 删除方式:delete 一条一条删除,不清空auto_increment记录数 truncate 直接将 ...
- PHP 博客收集
https://lvwenhan.com/ www.chrisyue.com https://silex.symfony.com/ https://www.chrisyue.com/translati ...
- [HDU - 5408] CRB and Farm
题意: 给出一个由n个点组成的凸包,以及凸包内的k个点,问是否能够在凸包上选择最多2k个点构造一个新的 凸包,使得新的凸包覆盖原来的k个点. 要求2k个点覆盖原本的k个点,只要对原k个点构造凸包,然后 ...
- 【AI in 美团】深度学习在OCR中的应用
AI(人工智能)技术已经广泛应用于美团的众多业务,从美团App到大众点评App,从外卖到打车出行,从旅游到婚庆亲子,美团数百名最优秀的算法工程师正致力于将AI技术应用于搜索.推荐.广告.风控.智能调度 ...