首页 > 其他分享 >CF1311F Moving Points

CF1311F Moving Points

时间:2022-10-20 16:03:46浏览次数:78  
标签:int sum update Points Moving hsum CF1311F ans query

题目传送门

思路

给出一种不需要脑子的四颗树状数组解法。

这四颗树状数组分别为:一颗维护负数,一颗维护负数个数,一颗维护正数,一颗维护正数个数。

首先考虑没有速度该怎么求。

不妨先按 \(x_i\) 从小到大排序,答案为 \(\sum x_i \times (i-1)-sum_i\),其中 \(sum_i\) 表示 \(\sum_{j=1}^i x_j\)。所以我们不妨先把 \(ans\) 赋值为这个值。

接下来考虑加入速度。

我们只需考虑两种情况:相遇和相离,由于时间无限,所以相遇的情况 \(d_{i,j}\) 一定是 \(0\),而相离后的距离一定大于 \(0\) 时刻的距离,所以 \(d_{i,j}\) 实际只有两种情况:\(0\),\(|x_i-x_j|\)。

我们已经把所有的 \(|x_i-x_j|\) 累加入答案,接下来只需要消去 \(0\) 的贡献即可。

设当前扫到的位置为 \(i\):

  • 若 \(v_i>0\),则此时能与 \(i\) 距离为 \(0\) 的点 \(j\) 必定满足 \(v_j>v_i\),这是简单的追及问题。
  • 若 \(v_i<0\),则此时能与 \(i\) 距离为 \(0\) 的点 \(j\) 必定满足 \(v_j>0\) 或 \(v_j<v_i\),\(v_j>0\) 是相遇问题,\(v_j<v_i\) 是追及问题。

接下来就可以简单地二维数点了,或者也可以像我一样暴力开四颗树状数组维护。

代码

//A tree without skin will surely die. 
//A man without face is invincible.
#include<bits/stdc++.h>
using namespace std;
#define int long long
int const N=2e5+10;
int n,b[N],sum[N],hsum[N];
struct node{int x,v;}a[N];
struct Tree_Array{
    int c[N];
    #define lowbit(x) (x&-x)
    inline void update(int x,int v){while (x<=n) c[x]+=v,x+=lowbit(x);}
    inline int query(int x){int res=0;while (x) res+=c[x],x-=lowbit(x);return res;}
}T[5];
inline bool cmp(node a,node b){return a.x<b.x;}
signed main(){
    //读入
    sort(b+1,b+n+1);int l=unique(b+1,b+n+1)-b-1;//离散化
    for (int i=1;i<=n;++i) a[i].v=lower_bound(b+1,b+l+1,a[i].v)-b;
    sort(a+1,a+n+1,cmp);int ans=0;
    for (int i=1;i<=n;++i) sum[i]=sum[i-1]+a[i].x;
    for (int i=n;i>=1;--i) hsum[i]=hsum[i+1]+a[i].x;
    for (int i=1;i<=n;++i) ans+=a[i].x*(i-1)-sum[i-1];
    int sum0=0,sum=0;
    for (int i=1;i<=n;i=i){
        int j=i;while (a[j+1].x==a[i].x) ++j;
        for (int k=i;k<=j;++k){
            if (!b[a[k].v]){
                ans-=a[k].x*T[3].query(n)-T[0].query(n);
                continue;
            }
            if (b[a[k].v]>0) ans-=a[k].x*(T[3].query(n)-T[3].query(a[k].v))-(T[0].query(n)-T[0].query(a[k].v));
            else ans-=a[k].x*sum0-sum+a[k].x*(T[3].query(n)+(T[4].query(n)-T[4].query(a[k].v)))-(T[0].query(n)+(T[1].query(n)-T[1].query(a[k].v)));
        }
        for (int k=i;k<=j;++k){
            if (!b[a[k].v]){
                ++sum0;
                sum+=a[k].x;
                continue;
            }
            if (b[a[k].v]>0) T[0].update(a[k].v,a[k].x),T[3].update(a[k].v,1);
            else T[1].update(a[k].v,a[k].x),T[4].update(a[k].v,1);
        }
        i=j+1;
    }
    //输出
    return 0;
}

标签:int,sum,update,Points,Moving,hsum,CF1311F,ans,query
From: https://www.cnblogs.com/tx-lcy/p/16810144.html

相关文章

  • 【luogu CF1140F】Extending Set of Points(线段树分治)
    ExtendingSetofPoints题目链接:luoguCF1140F题目大意有一个点集,有一个扩展操作是加入符合条件的(x0,y0)直到不能加入位置。符合条件是原来(x0,y0)不存在而且存......
  • 「ARC150D」Removing Gacha
    题目点这里看题目。给定一棵\(n\)个结点的树。进行如下过程:初始时,所有结点都是白色,且计数器变量\(c=0\)。重复一下两个步骤:如果所有结点都是黑色,停止该过......
  • ARC150D Removing Gacha(组合)
    ARC150DRemovingGacha有一棵\(N\)个白点的树根为\(1\),每次等概率随机选一个到\(1\)的路径上有白点的点涂黑,问期望几次整棵树被涂黑。模\(998244353\)。CODE首先......
  • Method breakpoints may dramatically slow down debugging 解决 项目无法启动 打开Br
    Methodbreakpointsmaydramaticallyslowdowndebugging解决项目无法启动打开Breakpoints面板(快捷键:Ctrl-Shift-F8),将断点取消勾选即可。项目无法启动了......
  • [AGC028B] Removing Blocks
    E-EternalAverage真的好做这道题的时候严重怀疑自己发烧了,不知道为什么,感觉身上冷冰冰的,头还烫烫的,有可能是因为太闷了,导致脑子有点不够用性质推简单dp了令最后留下......
  • Four Points
    ProblemStatementThereisarectangleinthe$xy$-plane.Eachedgeofthisrectangleisparalleltothe$x$-or$y$-axis,anditsareaisnotzero.Giventhe......
  • points_harris算子
    points_harris—DetectpointsofinterestusingtheHarrisoperator.points_harris:通过Harris运算检测感兴趣的点。points_harris(Image::SigmaGrad,SigmaSmoo......
  • proj_match_points_ransac 算子
    proj_match_points_ransac(Image1,Image2::Rows1,Cols1,Rows2,Cols2,GrayMatchMethod,MaskSize,RowMove,ColMove,RowTolerance,ColTolerance,Rotation,Matc......
  • 从SAP ECC升级到SAP S4HANA, 几个Key Points
    从SAPECC升级到SAPS4HANA,几个KeyPoints  自从SAP公司的拳头产品S/4HANA横空出世以来,就引起了世界范围内的众多客户以及ERP咨询业界的强烈关注。 笔者发现很......
  • CF1453D Checkpoints(期望)
    Gildongisdevelopingagameconsistingof......