\[\texttt{Preface}
\]

赛时,把 " 任意时刻 " 理解成 " 整数时刻 " 了,看起来一脸不可做的亚子,还各种推式子。

话说我为什么觉得 E 比 F 还难。

\[\texttt{Description}
\]

一个坐标轴 \(OX\) 上有 \(n\) 个点,第 \(i\) 个点位于整数点 \(x_i\) ,速度为 \(v_i\) 。

所有点以恒定的速度移动,在时刻 \(t\) ( \(t\) 可以是非整数),第 \(i\) 个点的坐标可以被计算为 \(x_i + t \times v_i\) 。

定义 \(d(i,j)\) 为:任何可能的时刻,第 \(i\) 个点和第 \(j\) 个点的最小可能距离,即

\[\min\limits_{t\in[0,∞)} \{ |(x_i+t \times v_i)-(x_j+t \times v_j)| \}
\]

求 \(\sum\limits_{1 \leq i < j \leq n}d(i,j)\) 。

\[\texttt{Solution}
\]

  • 考虑任意两个点 \(i,j\) ,不妨设 \(x_i \leq x_j\) :
  1. 当 \(v_i \leq v_j\) 时:

    说明点 \(i\) 的速度不比点 \(j\) 快,意味着每过一秒,点 \(i,j\) 的距离会增大 \(v_j-v_i\) ,由于 \(t\times(v_j-v_i) \geq 0\) ,所以点 \(i,j\) 的距离永远不降,故时刻 \(0\) 时,\(d(i,j)\) 最小,此时 \(d(i,j)=x_j-x_i\) 。

  2. 当 \(v_i>v_j\) 时:

    说明点 \(i\) 的速度比点 \(j\) 快,意味着每过一秒,点 \(i,j\) 的距离会减少 \(v_i-v_j\) ,突然想到小学数学的 追及问题 ,显然可得,在时刻 \(\frac{x_j-x_i}{v_i-v_j}\) 时,点 \(i\) 与点 \(j\) 重合,故 \(d(i,j)=0\) 。

  • 我们发现情况 \(2\) 对答案没有贡献,实际上只是求情况 \(1\) 的贡献,也就是 \(\sum\limits_{x_i \leq x_j \ \& \ v_i \leq v_j}(x_j-x_i)\) 。

  • 然后我们发现这是一个经典的偏序问题,具体的:

  • 我们将所有点按 \(x\) 这一维从小到大排序,就可以直接去掉 \(x_i \leq x_j\) 的偏序关系了。

  • 将 \(v\) 这一维离散化,建立两个 BIT(当然线段树也行),一个用于维护当前扫描到的点中, \(v\) 值在区间内的点的个数,一个用于维护 \(v\) 值在区间内的点的 \(x\) 值和。

  • 接下来我们扫描每个点 \(i\) ,计算将 \(i\) 当成位置靠后的那个点时所产生的贡献,当固定住 \(i\) 时,此时 \(x_i\) 是不变的,我们记 \(v\) 值小于等于 \(v_i\) 的点的数量为 \(c_1\) , \(v\) 值小于等于 \(v_i\) 点的 \(x\) 值和为 \(c_2\) ,贡献为 \(x_i \times c_1-c_2\) ,最后再将点 \(i\) 插入 BIT ,扫描完即可求出答案。

  • \(\mathcal{O(n \log n)}\) 。

\[\texttt{Code}
\]

#include<cstdio>
#include<algorithm> #define RI register int using namespace std; namespace IO
{
static char buf[1<<20],*fs,*ft;
inline char gc()
{
if(fs==ft)
{
ft=(fs=buf)+fread(buf,1,1<<20,stdin);
if(fs==ft)return EOF;
}
return *fs++;
}
#define gc() getchar()
inline int read()
{
int x=0,f=1;char s=gc();
while(s<'0'||s>'9'){if(s=='-')f=-f;s=gc();}
while(s>='0'&&s<='9'){x=x*10+s-'0';s=gc();}
return x*f;
}
}using IO::read; const int N=200100; int n; struct Node{
int x;
int v;
}a[N]; bool cmp(Node a,Node b)
{
return a.x<b.x;
} int len,mapval[N]; void discrete() // 离散化
{
sort(mapval+1,mapval+1+len);
len=unique(mapval+1,mapval+1+len)-mapval-1;
} int Real(int x)
{
return lower_bound(mapval+1,mapval+1+len,x)-mapval;
} long long c[N][2]; // 0 维是数量 , 1 维是 x 值和 void add(int x,int k,int val)
{
for(;x<=len;x+=x&-x)c[x][k]+=val;
} long long ask(int x,int k)
{
long long ans=0;
for(;x;x-=x&-x)ans+=c[x][k];
return ans;
} long long ans; int main()
{
n=read(); for(RI i=1;i<=n;i++)
a[i].x=read(); for(RI i=1;i<=n;i++)
mapval[++len]=a[i].v=read(); sort(a+1,a+1+n,cmp); // 排序 discrete(); for(RI i=1;i<=n;i++)
a[i].v=Real(a[i].v); for(RI i=1;i<=n;i++)
{
ans+=a[i].x*ask(a[i].v,0)-ask(a[i].v,1); // 计算
add(a[i].v,0,1),add(a[i].v,1,a[i].x);
} printf("%lld\n",ans); return 0;
}

\[\texttt{Thanks} \ \texttt{for} \ \texttt{watching}
\]

题解【CF1311F Moving Points】的更多相关文章

  1. [CF1311F] Moving Points - 树状数组

    Solution 按 \(x\) 关键字升序排序,依次枚举每个点 考虑对任意 \(x_j < x_i\),那么当 \(v_j \leq v_i\) 时,它们不会相交,且 \(dis\) 就是它们 ...

  2. F. Moving Points 解析(思維、離散化、BIT、前綴和)

    Codeforce 1311 F. Moving Points 解析(思維.離散化.BIT.前綴和) 今天我們來看看CF1311F 題目連結 題目 略,請直接看原題. 前言 最近寫1900的題目更容易 ...

  3. HDOJ 4717 The Moving Points

    The Moving Points Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  4. HDU 4717The Moving Points warmup2 1002题(三分)

    The Moving Points Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  5. The Moving Points hdu4717

    The Moving Points Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  6. HDU 4717 The Moving Points (三分)

    The Moving Points Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  7. HDUOJ---The Moving Points

    The Moving Points Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  8. 题解 CF576C 【Points on Plane】

    题解 CF576C [Points on Plane] 一道很好的思维题. 传送门 我们看这个曼哈顿距离,显然如果有一边是按顺序排列的,显然是最优的,那另一边怎么办呢? 假如你正在\(ioi\)赛场上 ...

  9. HDU-4717 The Moving Points(凸函数求极值)

    The Moving Points Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

随机推荐

  1. vue项目使用keep-alive

    作用: 在vue项目中,难免会有列表页面或者搜索结果列表页面,点击某个结果之后,返回回来时,如果不对结果页面进行缓存,那么返回列表页面的时候会回到初始状态,但是我们想要的结果是返回时这个页面还是之前搜 ...

  2. 类与 Object 的应用

    # 类与 Object 的应用 + 面试题 类介绍 Java 程序是由若干个类组成的,类也是面向对象编程思想的具体实现. 以下为类的基本使用: public class Cat { // 私有属性 p ...

  3. 超链接a标签的伪类选择器问题,Link标签与visited标签的失效问题(问题介绍与解决方法)。

    <!DOCTYPE html>< html>< head>     <meta charset="utf-8" />     < ...

  4. CSS 故障艺术

    本文的主题是 Glitch Art,故障艺术. 什么是故障艺术?我们熟知的抖音的 LOGO 正是故障艺术其中一种表现形式.它有一种魔幻的感觉,看起来具有闪烁.震动的效果,很吸引人眼球. 故障艺术它模拟 ...

  5. python学习Day02

    [主要内容] 1. 循环. while循环 while 条件: 代码块(循环体) 执行流程: 1. 判断条件是否为真. 如果真. 执行代码块 2. 再次判断条件是否为真...... 3. 当条件为假. ...

  6. linux --- 杀掉特定端口进程与启用SSH服务

    Linux下端口被占用解决 有时候关闭软件后,后台进程死掉,导致端口被占用.下面以JBoss端口8083被占用为例,列出详细解决过程. 解决方法: 1.查找被占用的端口 netstat -tln ne ...

  7. tornado自定义分页扩展

    一.分页扩展类 #! /usr/bin/env python # -*- coding:utf-8 -*- # __author__ = "TKQ" class Paginatio ...

  8. python练习——第2题

    原GitHub地址:https://github.com/Yixiaohan/show-me-the-code 题目:将 0001 题生成的 200 个激活码(或者优惠券)保存到 MySQL 关系型数 ...

  9. error C2662

    原因:关于const的问题 具体错误:函数的参数列表中参数签名为const,但是却调用了该参数的非const的成员函数 例子: 即使我们知道NoConst()并不会改变类的data成员,编译器依旧会报 ...

  10. html标签学习入门 随笔

    Html学习入门    随笔1: HTML 标题 HTML 标题(Heading)是通过 <h1> - <h6> 等标签进行定义的. 标题仅用于标题文本  不应该被使用在加粗字 ...