[CF1311F] Moving Points - 树状数组
2024-09-06 11:19:26
Solution
按 \(x\) 关键字升序排序,依次枚举每个点
考虑对任意 \(x_j < x_i\),那么当 \(v_j \leq v_i\) 时,它们不会相交,且 \(dis\) 就是它们初态的距离 \(x_i-x_j\)
开两个树状数组,以离散化后的 \(v\) 为下标,一个维护个数和,一个维护坐标和
那么每次询问的答案就是 个数和 $\cdot x_i - $ 坐标和
然后把这个点插进去即可
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 200005;
struct point {
int v,x;
bool operator < (const point &b) {
return x<b.x;
}
} p[N];
int n,ans;
struct ar {
int b[N];
int lowbit(int x) {return x&(-x);}
void modify(int x,int v) {
for(;x<=n;x+=lowbit(x)) (b[x]+=v);
}
int query(int x) {
int ans=0;
for(;x;x-=lowbit(x)) (ans+=b[x]);
return ans;
}
} a,b;
map<int,int> mp;
signed main() {
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++) cin>>p[i].x;
for(int i=1;i<=n;i++) cin>>p[i].v, mp[p[i].v]++;
int ind=0;
for(auto i=mp.begin();i!=mp.end();i++) i->second=++ind;
for(int i=1;i<=n;i++) p[i].v = mp[p[i].v];
sort(p+1,p+n+1);
for(int i=1;i<=n;i++) {
ans += a.query(p[i].v) * p[i].x - b.query(p[i].v);
a.modify(p[i].v, 1);
b.modify(p[i].v, p[i].x);
}
cout<<ans<<endl;
}
最新文章
- [bzoj2463]谁能赢呢
- IOS APP上下黑边问题
- TP中不区分大小写__APP__和__URL__的注意事项
- 去掉hint提示文字
- Oracle 自己主动诊断资料档案库 (ADR)、自己主动诊断工作流、ADRCI工具
- Struts2中将.action改为.do
- 编写一个程序实现strlen函数的功能
- jquery mobile -role
- 【WPF】学习笔记(三)——这个家伙跟电子签名板有个约定
- .net 上传文件 Failed to load resource: net::ERR_CONNECTION_RESET Bug 解决
- Django之 静态模板渲染
- Hyper-V:无法打开虚拟机XXX,因为虚拟机监控程序未运行
- .net DataTable序列化成Json
- 将png图片转换为字体图标
- String----是一个对象
- python之模块datetime 常见操作
- .net 运行中出现的错误解决方法记录
- Django实现任意文件上传(最简单的方法)
- bzoj 2226 LCMSum 欧拉函数
- 易普优APS高级计划排程系统系列提纲:行业知识,业务建模,排程算法,计划可视化,平台框架,案例分享