P2345 奶牛集会(树状数组/CDQ分治)
题目描述
约翰的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分治)相关推荐
- HDU - 5517 Triple(三维偏序-二维树状数组/CDQ分治)
题目链接:点击查看 题目大意:给出 n 个二元对 ( a , b ) 和 m 个三元对 ( c , d , e ),对于所有 b == e 的二元对和三元对,可以通过某种运算形成一个新的三元对 ( a ...
- 【USACO】奶牛抗议 树状数组+dp
题目描述 约翰家的 N 头奶牛正在排队游行抗议.一些奶牛情绪激动,约翰测算下来,排在第 i 位的奶牛 的理智度为 A i ,数字可正可负. 约翰希望奶牛在抗议时保持理性,为此,他打算将这条队伍分割成几 ...
- [luogu] P2345 MooFest G 树状数组
前言 传送门 : 思路 很好的一个 树状数组入门题 我们可以通过树状数组维护 sumsumsum 和 cntcntcnt最后计算出答案 CODE struct node {int v,x;bool o ...
- P2345 奶牛集会(树状数组or模拟)
题目背景 MooFest, 2004 Open 题目描述 约翰的N 头奶牛每年都会参加"哞哞大会".哞哞大会是奶牛界的盛事.集会上的活动很 多,比如堆干草,跨栅栏,摸牛仔的屁股等等 ...
- BZOJ 1176: [Balkan2007]Mokia( CDQ分治 + 树状数组 )
考虑cdq分治, 对于[l, r)递归[l, m), [m, r); 然后计算[l, m)的操作对[m, r)中询问的影响就可以了. 具体就是差分答案+排序+离散化然后树状数组维护.操作数为M的话时间 ...
- CDQ分治 + 树状数组 ---- C. Goodbye Souvenir(三维偏序+思维)
题目链接 题目大意: 给定长度为nnn的数组, 定义数字XXX在[l,r][l,r][l,r]内的值为数字XXX在[l,r][l,r][l,r]内最后一次出现位置的下标减去第一次出现位置的下标 给定m ...
- BZOJ - 2244 拦截导弹 (dp,CDQ分治+树状数组优化)
BZOJ - 2244 拦截导弹 (dp,CDQ分治+树状数组优化) 1 #include<algorithm> 2 #include<iostream> 3 #include ...
- BZOJ 2716 [Violet 3]天使玩偶 (CDQ分治、树状数组)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2716 怎么KD树跑得都那么快啊..我写的CDQ分治被暴虐 做四遍CDQ分治,每次求一个 ...
- 洛谷 - P3810 【模板】三维偏序(陌上花开)(CDQ分治套树状数组)
题目链接:点击查看 题目大意:给出 n 个点,每个点有三个属性 a , b , c ,对于每个点 i 来说,求出有多少个 j 满足 a[ j ] <= a[ i ] && b[ ...
最新文章
- 链表问题15——将搜索二叉树转换成双向链表
- centos7 搭建nfs共享文件
- 小米一键上锁工具_小米新品人脸识别智能锁:3D识别加红外,开门只需看一眼...
- 使用mpvue和wepy开发小程序
- About The FTP
- hdu 5568(dp+大数模拟)
- cd 地址 linux,Ubuntu10.10 CD/DVD下?地址+校??
- 【Qt】QModbusTcpConnectionObserver类
- php循环建立新的文件根据文件名移动文件到指定文件夹修改文件名称
- 大量删除的表、查询卡顿的表,重建索引
- 实战 | Java 流之Stream,Lambda以及日期
- 中jsp加载不出来layui_加载页面信息,刷不出来心态都崩了
- 利用after和before伪元素在文字两边写横线
- 文本整理器 v3.0 官方
- 单片机驱动程序是什么,驱动文件组成。
- 【渝粤教育】21秋期末考试中国近现代史纲要(A)10881k1
- 2019半年总结——学习与成长
- 【Proteus仿真】51单片机+直流电机PWM调速实验
- 数字藏品交易平台如何上架数字藏品?
- 安卓 保存图片到相册
热门文章
- WAX 区块链发行的 Topps 数字收藏卡将在美国沃尔玛和塔吉特发售
- 【每日新闻】牛津大学报告:中国人工智能实力只有美国一半 | 工信部:一季度生产集成电路399.9亿块,同比增长15.2%...
- 中国陶瓷、卫浴部分知名品牌名单
- 如何强制刷新组策略并显示应用的组策略有哪些?
- python请求飞书API操作
- 淘宝(电商)店铺SEO优化:几大雷区要注意的事项有.......
- 3.好久不见,甚是想念
- Aptana 修改代码格式化快捷键
- 广东设大学生创业基金及股权交易平台
- 多人上传文件公共网盘_解决百度网盘上传提示“上传文件数量超过500个限制”的方法...