题目背景

MooFest, 2004 Open

题目描述

约翰的N 头奶牛每年都会参加“哞哞大会”。哞哞大会是奶牛界的盛事。集会上的活动很

多,比如堆干草,跨栅栏,摸牛仔的屁股等等。它们参加活动时会聚在一起,第i 头奶牛的坐标为Xi,没有两头奶牛的坐标是相同的。奶牛们的叫声很大,第i 头和第j 头奶牛交流,会发出max{Vi; Vj}×|Xi − Xj | 的音量,其中Vi 和Vj 分别是第i 头和第j 头奶牛的听力。假设每对奶牛之间同时都在说话,请计算所有奶牛产生的音量之和是多少。

输入输出格式

输入格式:

• 第一行:单个整数N,1 ≤ N ≤ 20000

• 第二行到第N + 1 行:第i + 1 行有两个整数Vi 和Xi,1 ≤ Vi ≤ 20000; 1 ≤ Xi ≤ 20000

输出格式:

• 单个整数:表示所有奶牛产生的音量之和

输入输出样例

输入样例#1: 复制

4
3 1
2 5
2 6
4 3

输出样例#1: 复制

57

说明

朴素O(N2)

类似于归并排序的二分O(N logN)

树状数组O(N logN)

思路:这个题要说思路还是不是很难的,不过容易出错,为了防止出错以及后续看不懂,我们先来一个简单的模拟解法,代码如下

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 20010;
long long n, tempSum, ans;
struct Node {int x, v;
}node[maxn];
int cmp(Node a, Node b) {return a.v > b.v;
}
int main() {cin >> n;for (int i = 1; i <= n; i++) {cin >> node[i].v >> node[i].x;}sort(node + 1, node + n + 1, cmp);for (int i = 1; i <= n; i++) {long long sum = 0;for (int j = i + 1; j <= n; j++) {if (node[j].x <= node[i].x) {sum += node[i]. x - node[j].x;} else {sum += (node[j].x - node[i].x);}}ans += node[i].v * sum;}cout << ans << endl;
}

是不是非常简单,要是你只满足于做出这道题,那么下面你就可以不用看了,若你还想进一步优化这个题目,那么你可以继续看看下面的树状数组的讲解

首先,根据上面我们模拟的做法,我们知道其实求的就是该点的V值乘以V值比他小的点到该点的横坐标的和,将这个过程执行n次并且把每次结果相加就可以得到最后的结果,在模拟的过程中,我们是把V值从大到小排列,那么在树状数组中,我们使用从小到大排列

我们用c【】来表示该树状数组里面的值,也就是这个区间内X值的和,num【】数组表示这区间内的点,sum表示X的坐标小于等于传入参数的和,cnt表示X的坐标小于等于传入参数的个数,因为我们是按V值从小到大排序,那么我们取出的每一个Node可以和它之前的Node进行运算,然后运算结果有俩种情况需要讨论:

1.之前的结点的X值比当前的节点的X值小,那么 ans = 当前节点的V值(node【i】.v)乘以所有之前所有结点到当前结点的X值的和,所以ans = node【i].v * (node[i].x * cnt- sum);解释一下就是当前节点的值已经在运算过程中抵消了,我们是这样运算的,共有cnt个结点的X值小于当前的X值,那么我们求他们到当前X值的距离可以先算原点到当前X值的总距离然后减去每个点到原点的总距离即可

2.之前的节点的X值比当前的节点的X值大,那么我们每次用tot减去比节点X小的节点的坐标的和,得到的就是所有比当前节点X的值大的和,然后减去比当前节点X大的节点的个数乘以当前的节点的X值,也就计算出比X值大的节点到X的总距离,稍微脑袋里模拟一下便知道了,tot表示之前出现的点的X坐标的和

#include<iostream>
#include<algorithm>
using namespace std;
#define lowbit(i) ((i) & (-i))
const int maxn = 20010;
struct Node{int v, x;
}node[maxn];int cmp(Node a, Node b) {return a.v < b.v;
}
long long n, sum, cnt, ans, tot;
int c[maxn], num[maxn];
void update(int x, int v) {for (int i = x; i < maxn; i += lowbit(i)) {c[i] += v;num[i] += 1;}
}void getSum(int x) {for (int i = x; i > 0; i -= lowbit(i)) {sum += c[i];cnt += num[i];}
}
int main() {cin >> n;for(int i = 1; i <= n; i++) {cin >> node[i].v >> node[i].x;}sort(node + 1, node + 1 + n, cmp);for (int i = 1; i <= n; i++) {sum = 0, cnt = 0;update(node[i].x, node[i].x);getSum(node[i].x);tot += node[i].x;ans += node[i].v * (cnt * node[i].x - sum + tot - sum - node[i].x * (i - cnt));}cout << ans << endl;return 0;
}

P2345 奶牛集会(树状数组or模拟)相关推荐

  1. 【USACO】奶牛抗议 树状数组+dp

    题目描述 约翰家的 N 头奶牛正在排队游行抗议.一些奶牛情绪激动,约翰测算下来,排在第 i 位的奶牛 的理智度为 A i ,数字可正可负. 约翰希望奶牛在抗议时保持理性,为此,他打算将这条队伍分割成几 ...

  2. [luogu] P2345 MooFest G 树状数组

    前言 传送门 : 思路 很好的一个 树状数组入门题 我们可以通过树状数组维护 sumsumsum 和 cntcntcnt最后计算出答案 CODE struct node {int v,x;bool o ...

  3. P2345 奶牛集会(树状数组/CDQ分治)

    题目描述 约翰的N 头奶牛每年都会参加"哞哞大会".哞哞大会是奶牛界的盛事.集会上的活动很多,比如堆干草,跨栅栏,摸牛仔的屁股等等.它们参加活动时会聚在一起,第i 头奶牛的坐标为X ...

  4. 【2018.12.15】【考试总结】【模拟+逆序对+树状数组+贪心+multiset】爆零之旅

    这是我悲惨的接近爆零的一次考试,但是本蒟蒻不能放弃,还是要总结的QAQ 答题卡 [题目背景] 八月是个悲惨的月份.先不谈炎热的天气,对于新生来说,八月意味着军训: 而对于高二高三的同学来说,八月意味着 ...

  5. JZOJ 3.10 1542——跑步(树状数组+模拟+排序/归并排序)

    题目描述 FJ觉得赛马很无聊,于是决定调查将赛牛作为一种运动的可能性.他安排了N(1 <= N <= 100,000)头奶牛来进行一个L圈的赛牛比赛,比赛在一个环形的长度为C的跑道上进行. ...

  6. Codeforces 216D Spider#39;s Web 树状数组+模拟

    题目链接:http://codeforces.com/problemset/problem/216/D 题意: 对于一个梯形区域,假设梯形左边的点数!=梯形右边的点数,那么这个梯形为红色.否则为绿色, ...

  7. 「模拟赛20180306」回忆树 memory LCA+KMP+AC自动机+树状数组

    题目描述 回忆树是一棵树,树边上有小写字母. 一次回忆是这样的:你想起过往,触及心底--唔,不对,我们要说题目. 这题中我们认为回忆是这样的:给定 \(2\) 个点 \(u,v\) (\(u\) 可能 ...

  8. luogu P2344 奶牛抗议 DP 树状数组 离散化

    P2344 奶牛抗议 最新讨论 暂时没有讨论 题目背景 Generic Cow Protests, 2011 Feb 题目描述 约翰家的N 头奶牛正在排队游行抗议.一些奶牛情绪激动,约翰测算下来,排在 ...

  9. 【洛谷】NOIP提高组模拟赛Day2【动态开节点/树状数组】【双头链表模拟】

    U41571 Agent2 题目背景 炎炎夏日还没有过去,Agent们没有一个想出去外面搞事情的.每当ENLIGHTENED总部组织活动时,人人都说有空,结果到了活动日,却一个接着一个咕咕咕了.只有不 ...

最新文章

  1. 一致 Hash 算法
  2. pat 乙级 1019 数字黑洞(C++)
  3. 超美响应式自适应引导页带音乐播放器源码
  4. 使用VMWareWorkstation搭建学习环境
  5. 基于postman的api自动化测试实践
  6. 计算机无法安装蓝牙驱动,windows10系统安装蓝牙驱动图文教程|windows10系统如何安装蓝牙驱动...
  7. Git 常用回滚撤销命令总结
  8. 保姆级笔记-佳能Canon LBP2900在Win10安装驱动
  9. LeetCode-----第二题-----两数相加
  10. FFMPEG详细参数
  11. nacos运行报jar的错Failed to get nested archive for entry BOOT-INF/lib/XXX.jar
  12. 常用工具软件的交叉编译
  13. 植树节的微信软文如何写?素材加文案帮你分分钟搞定!
  14. 天使投资AI、风险投资VC、私募股权投资PE、投行IB、FOF、普通合伙人GP、有限合伙人LP、PIPE
  15. Android 性能优化(62)---存检测、卡顿优化、耗电优化、APK瘦身——详解篇
  16. s7填表指令att_S7-200PLC 表操作指令
  17. 青龙快手极速版最新撸毛脚本(2022.07.30)KS()
  18. js的常用功能及属性总结
  19. Linux——信号及其使用
  20. cassandra nodetool 指令

热门文章

  1. HBuildX 打包内存溢出问题
  2. Learn Some Framework-1
  3. 网站经常崩溃,企业应该如何做好监控?
  4. android获取设备唯一标识完美解决方案
  5. Unity学习笔记--NavMeshAgent可能造成原地旋转的问题
  6. python求m和n之间的所有素数_求m至n之间的所有素数(编程)
  7. 软件测试的概念与过程----学习软件测试前的思考
  8. xbox运作原理和协议(转载)(生肉)
  9. appStore审核说明
  10. mateRS能升级鸿蒙系统吗,为什么万元机华为maters保时捷玩吃鸡真么垃圾