题目描述

约翰的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

输出格式

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


题解:
我们可以先按v排序,然后用树状数组维护比该牛x小的数的个数,以及它们的和

开两个树状数组,一个维护比当前牛x小的数的个数,一个维护比牛x小的数的总和

然后就可以化简绝对值公式了,加入当前牛造成的贡献就为:

a [ i ] . v ∗ ( l ∗ a [ i ] . x − l s u m + r s u m − r ∗ a [ i ] . x ) a[i].v*(l*a[i].x-lsum+rsum-r*a[i].x) a[i].v∗(l∗a[i].x−lsum+rsum−r∗a[i].x)


AC代码:

#pragma GCC optimize(2)
#include<bits/stdc++.h>
#include<ext/rope>
#define int long long
using namespace std;
using namespace __gnu_cxx;
typedef long long LL;
const int MAXN = 20010;
const int MOD = 1e9+7;
const int INF = 0x3f3f3f3f;
int n,res;
struct node{ int v,x; }a[MAXN];
inline bool cmp(node a,node b){ return a.v<b.v; }
struct BIT{int bit[MAXN];inline int lowbit(int x){ return x&-x; }inline void add(int x,int val){ for(int i=x;i<=20000;i+=lowbit(i)) bit[i]+=val; }inline int query(int x,int res=0){ for(int i=x;i;i-=lowbit(i)) res+=bit[i]; return res; }
}t1,t2;
signed main(){#ifndef ONLINE_JUDGEfreopen("C:\\Users\\Administrator\\Desktop\\in.txt","r",stdin);
#endif // ONLINE_JUDGEcin>>n;for(int i=1;i<=n;i++) cin>>a[i].v>>a[i].x;sort(a+1,a+n+1,cmp);for(int i=1;i<=n;i++){int l=t1.query(a[i].x-1),r=t1.query(20000)-t1.query(a[i].x);int lsum=t2.query(a[i].x-1),rsum=t2.query(20000)-t2.query(a[i].x);res += a[i].v*(l*a[i].x-lsum+rsum-r*a[i].x);t1.add(a[i].x,1);t2.add(a[i].x,a[i].x);}cout<<res<<'\n';return 0;
}

AC代码(CDQ分治):

#pragma GCC optimize(2)
#include<bits/stdc++.h>
#include<ext/rope>
#define int long long
using namespace std;
using namespace __gnu_cxx;
typedef long long LL;
const int MAXN = 20010;
const int MOD = 1e9+7;
const int INF = 0x3f3f3f3f;
int n,res;
struct node{ int v,x; }a[MAXN],b[MAXN];
inline bool cmp(node a,node b){ return a.v<b.v; }
inline void CDQ(int l,int r){if(l==r) return; int mid=(l+r)>>1;int sum1=0,sum2=0,tot=l;//CDQ(l,mid); CDQ(mid+1,r);for(int i=l;i<=mid;i++) sum1+=a[i].x;for(int i=mid+1;i<=r;i++){while(tot<=mid && a[tot].x<a[i].x){//tot为划分的中点,其左边都小于x,右边都大于xsum2 += a[tot].x; sum1 -= a[tot].x; tot++;}res += a[i].v*(a[i].x*(tot-l)-sum2-a[i].x*(mid-tot+1)+sum1);}int p=l,q=mid+1,cnt=l;while(p<=mid && q<=r){if(a[p].x<=a[q].x) b[cnt++]=a[p++];else b[cnt++]=a[q++];}while(p<=mid) b[cnt++]=a[p++];while(q<=r) b[cnt++]=a[q++];for(int i=l;i<=r;i++) a[i]=b[i];
}
signed main(){#ifndef ONLINE_JUDGEfreopen("C:\\Users\\Administrator\\Desktop\\in.txt","r",stdin);
#endif // ONLINE_JUDGEcin>>n;for(int i=1;i<=n;i++) cin>>a[i].v>>a[i].x;sort(a+1,a+n+1,cmp);CDQ(1,n);cout<<res<<endl;return 0;
}

P2345 奶牛集会(树状数组/CDQ分治)相关推荐

  1. HDU - 5517 Triple(三维偏序-二维树状数组/CDQ分治)

    题目链接:点击查看 题目大意:给出 n 个二元对 ( a , b ) 和 m 个三元对 ( c , d , e ),对于所有 b == e 的二元对和三元对,可以通过某种运算形成一个新的三元对 ( a ...

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

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

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

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

  4. P2345 奶牛集会(树状数组or模拟)

    题目背景 MooFest, 2004 Open 题目描述 约翰的N 头奶牛每年都会参加"哞哞大会".哞哞大会是奶牛界的盛事.集会上的活动很 多,比如堆干草,跨栅栏,摸牛仔的屁股等等 ...

  5. BZOJ 1176: [Balkan2007]Mokia( CDQ分治 + 树状数组 )

    考虑cdq分治, 对于[l, r)递归[l, m), [m, r); 然后计算[l, m)的操作对[m, r)中询问的影响就可以了. 具体就是差分答案+排序+离散化然后树状数组维护.操作数为M的话时间 ...

  6. CDQ分治 + 树状数组 ---- C. Goodbye Souvenir(三维偏序+思维)

    题目链接 题目大意: 给定长度为nnn的数组, 定义数字XXX在[l,r][l,r][l,r]内的值为数字XXX在[l,r][l,r][l,r]内最后一次出现位置的下标减去第一次出现位置的下标 给定m ...

  7. BZOJ - 2244 拦截导弹 (dp,CDQ分治+树状数组优化)

    BZOJ - 2244 拦截导弹 (dp,CDQ分治+树状数组优化) 1 #include<algorithm> 2 #include<iostream> 3 #include ...

  8. BZOJ 2716 [Violet 3]天使玩偶 (CDQ分治、树状数组)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2716 怎么KD树跑得都那么快啊..我写的CDQ分治被暴虐 做四遍CDQ分治,每次求一个 ...

  9. 洛谷 - P3810 【模板】三维偏序(陌上花开)(CDQ分治套树状数组)

    题目链接:点击查看 题目大意:给出 n 个点,每个点有三个属性 a , b , c ,对于每个点 i 来说,求出有多少个 j 满足 a[ j ] <= a[ i ] && b[ ...

最新文章

  1. 链表问题15——将搜索二叉树转换成双向链表
  2. centos7 搭建nfs共享文件
  3. 小米一键上锁工具_小米新品人脸识别智能锁:3D识别加红外,开门只需看一眼...
  4. 使用mpvue和wepy开发小程序
  5. About The FTP
  6. hdu 5568(dp+大数模拟)
  7. cd 地址 linux,Ubuntu10.10 CD/DVD下?地址+校??
  8. 【Qt】QModbusTcpConnectionObserver类
  9. php循环建立新的文件根据文件名移动文件到指定文件夹修改文件名称
  10. 大量删除的表、查询卡顿的表,重建索引
  11. 实战 | Java 流之Stream,Lambda以及日期
  12. 中jsp加载不出来layui_加载页面信息,刷不出来心态都崩了
  13. 利用after和before伪元素在文字两边写横线
  14. 文本整理器 v3.0 官方
  15. 单片机驱动程序是什么,驱动文件组成。
  16. 【渝粤教育】21秋期末考试中国近现代史纲要(A)10881k1
  17. 2019半年总结——学习与成长
  18. 【Proteus仿真】51单片机+直流电机PWM调速实验
  19. 数字藏品交易平台如何上架数字藏品?
  20. 安卓 保存图片到相册

热门文章

  1. WAX 区块链发行的 Topps 数字收藏卡将在美国沃尔玛和塔吉特发售
  2. 【每日新闻】牛津大学报告:中国人工智能实力只有美国一半 | 工信部:一季度生产集成电路399.9亿块,同比增长15.2%...
  3. 中国陶瓷、卫浴部分知名品牌名单
  4. 如何强制刷新组策略并显示应用的组策略有哪些?
  5. python请求飞书API操作
  6. 淘宝(电商)店铺SEO优化:几大雷区要注意的事项有.......
  7. 3.好久不见,甚是想念
  8. Aptana 修改代码格式化快捷键
  9. 广东设大学生创业基金及股权交易平台
  10. 多人上传文件公共网盘_解决百度网盘上传提示“上传文件数量超过500个限制”的方法...