Luogu2345 | 奶牛集会 (树状数组)
题目背景
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
————————————————————————————————————
音量的计算公式 \(max[Vi,Vj]×|Xi−Xj|\) 看起来很友好,
由于奶牛两两之间都会发出声音,很容易想到先将奶牛按 \(Vi\) 升序排序,之后每遍历到一只奶牛,就计算这只奶牛与此前出现的所有奶牛发出的音量,统计进答案中即可。
这样我们需要求的就是当前奶牛与此前出现的所有奶牛的距离之和,即 \(\sum_{j=1}^{i-1}dis(i,j)\)
上面的这个式子是 \(O(N^2)\) 的,而我们需要在 \(O(logn)\) 的时间内解决,所以可以使用支持单点修改和区间查询的树状数组优化,
这里使用了两个树状数组,分别存储了奶牛的个数和奶牛的坐标和(即到原点的距离和)
接下里我们把坐标小于当前奶牛和坐标大于当前奶牛的分开处理,具体计算公式请见代码。
最后别忘了把这个值乘上当前奶牛的 \(Vi\)再 统计进答案,之后还要把当前奶牛的数值加入两个树状数组中。
PS:还要开\(long long\)。
代码如下:
#include <bits/stdc++.h>
#define FOR(i,s,t) for (ll (i)=(s);(i)<=(t);(i)++)
#define lowbit(x) ((x)&(-x))
#define ll long long
#define MAXN 20007
#define MAXX 20007
using namespace std;
struct cow { ll v,x; }p[MAXN];
ll c1[MAXN],c2[MAXN],n,ans=0;
inline bool cmp(const cow &A,const cow &B) { return A.v<B.v; }
inline void add(ll x) { for (ll i=x;i<MAXX;i+=lowbit(i)) c1[i]++,c2[i]+=x; }
inline ll q1(ll x) {
ll ret=0;
for (ll i=x;i>=1;i-=lowbit(i)) ret+=c1[i];
return ret;
}
inline ll q2(ll x) {
ll ret=0;
for (ll i=x;i>=1;i-=lowbit(i)) ret+=c2[i];
return ret;
}
inline ll read() {
ll X=0,w=0; char ch=0;
while (!isdigit(ch)) w|=ch=='-',ch=getchar();
while (isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
return w?-X:X;
}
int main() {
memset(c1,0,sizeof(c1));
memset(c2,0,sizeof(c2));
n=read(); FOR(i,1,n) p[i].v=read(),p[i].x=read();
sort(p+1,p+n+1,cmp);
FOR(i,1,n) {
ll amt1=q1(p[i].x-1),dis1=amt1*p[i].x-q2(p[i].x-1);
ll amt2=q1(MAXX-1)-q1(p[i].x),dis2=q2(MAXX-1)-q2(p[i].x-1)-amt2*p[i].x;
ans+=(dis1+dis2)*p[i].v,add(p[i].x);
}
printf("%lld",ans);
return 0;
}
Luogu2345 | 奶牛集会 (树状数组)的更多相关文章
- 【USACO】奶牛抗议 树状数组+dp
题目描述 约翰家的 N 头奶牛正在排队游行抗议.一些奶牛情绪激动,约翰测算下来,排在第 i 位的奶牛 的理智度为 A i ,数字可正可负. 约翰希望奶牛在抗议时保持理性,为此,他打算将这条队伍分割成几 ...
- LUOGU P2344 奶牛抗议 (树状数组优化dp)
传送门 解题思路 树状数组优化dp,f[i]表示前i个奶牛的分组的个数,那么很容易得出$f[i]=\sum\limits_{1\leq j\leq i}f[j-1]*(sum[i]\ge sum[j- ...
- 【树状数组】【P2345】 奶牛集会
传送门 Description 约翰的\(N\)头奶牛每年都会参加"哞哞大会".哞哞大会是奶牛界的盛事.集会上的活动很多,比如堆干草,跨栅栏,摸牛仔的屁股等等.它们参加活动时会聚在 ...
- [USACO]奶牛抗议(DP+树状数组+离散化)
Description 约翰家的N头奶牛聚集在一起,排成一列,正在进行一项抗议活动.第i头奶牛的理智度 为Ai,Ai可能是负数.约翰希望奶牛在抗议时保持理性,为此,他打算将所有的奶牛隔离成 若干个小组 ...
- P2344 奶牛抗议 离散化+前缀和+动态规划+树状数组
[题目背景] Generic Cow Protests, 2011 Feb [题目描述] 约翰家的N 头奶牛正在排队游行抗议.一些奶牛情绪激动,约翰测算下来,排在第i 位的奶牛的理智度为Ai,数字可正 ...
- 奶牛抗议 DP 树状数组
奶牛抗议 DP 树状数组 USACO的题太猛了 容易想到\(DP\),设\(f[i]\)表示为在第\(i\)位时方案数,转移方程: \[ f[i]=\sum f[j]\;(j< i,sum[i] ...
- bzoj 1669: [Usaco2006 Oct]Hungry Cows饥饿的奶牛【dp+树状数组+hash】
最长上升子序列.虽然数据可以直接n方但是另写了个nlogn的 转移:f[i]=max(f[j]+1)(a[j]<a[i]) O(n^2) #include<iostream> #in ...
- POJ 1990 MooFest(树状数组)
MooFest Time Limit: 1000MS Mem ...
- BZOJ_4756_[Usaco2017 Jan]Promotion Counting_树状数组
BZOJ_4756_[Usaco2017 Jan]Promotion Counting_树状数组 Description n只奶牛构成了一个树形的公司,每个奶牛有一个能力值pi,1号奶牛为树根. 问对 ...
随机推荐
- .Net Core中IOC容器的使用
打代码之前先说一下几个概念,那就是什么是IOC.DI.DIP 虽然网上讲这些的已经有很多了,我这里还是要再赘述一下 IOC容器就是一个工厂,负责创建对象的 IOC控制反转:只是把上端对下端的依赖,换成 ...
- Go语言实现:【剑指offer】题目汇总
所列题目与牛客网<剑指offer>专题相对应. 数组: 和为S的两个数字 和为S的连续正数序列 连续子数组的最大和 数字在排序数组中出现的次数 数组中只出现一次的数字 旋转数组的最小数字 ...
- pthread_cond_broadcast & pthread_cond_signal
pthread_cond_broadcast(&cond1)的作用是唤醒所有正在pthread_cond_wait(&cond1,&mutex1)的线程. pthread_co ...
- 在centos6.3下安装php的Xdebug
首先下载一个xdebug http://www.xdebug.org/docs/ 官网上有windos版本和linux源码版本的,我们下载一个源码包xdebug-2.2.5.tgz 然后进入安装流程 ...
- Redis5.xc两种持久化方式以及主从复制配置
关注公众号:CoderBuff,回复"redis"获取<Redis5.x入门教程>完整版PDF. <Redis5.x入门教程>目录 第一章 · 准备工作 第 ...
- Apache httpd.conf配置文件 1(Global Environment )
Apache 版本: Server version: Apache/2.2.15 总计 1000行左右 英文前带井号的是注释,不起作用. 但很多注释去掉前方的 # 即可生效. # # This i ...
- JMeter接口测试-如何循环使用接口返回的多值?
前言 在用JMeter做接口测试的时候,经常会遇到这样一种情况:一个接口请求返回了多个值,然后下一个接口想循环使用前一个接口的返回值:第二种情况:只想循环请求前一个接口返回值中的随机不定长度的某一些值 ...
- NPM install -save 和 -save-dev 区别
最近在写Node程序的时候,突然对 npm install 的-save和-save-dev 这两个参数的使用比较混乱.其实博主在这之前对这两个参数的理解也是模糊的,各种查资料和实践后对它们之间的异同 ...
- linux学习--1. 文件系统
文件目录结构 闲话篇: linux我也是最近才开始学,写随笔是为分享学习经验的同时也留着供自己以后来参考.因为linux一切皆文件的基本哲学思想.所以我决定从文件目录开始写. 正文: 首先linux文 ...
- HTML——label标签
最近在做将input[type="file"] 改变其样式时,发现label的巨大潜力,特此记录一下. 1, label标签的作用 (1)为input元素定义标注(标记) (2)不 ...