首页 > 其他分享 >【2021提高组十连测day7】a

【2021提高组十连测day7】a

时间:2024-09-27 14:14:26浏览次数:9  
标签:cnt 组十连测 day7 sum 2021 扫描线 左上 复杂度

【2021提高组十连测day7】a

题意:求每个点和其他所有点曼哈顿距离的平方之和。

形式化地,求 \(\sum_{j=1}^{n} (|x_i-x_j|+|y_i-y_j|)^2(1\le i \le n)\)。

对于每个点,我们把其他点分成四部分:左上、左下、右上、右下。四个部分可以通过旋转整个坐标系来解决。因此这里讲如何处理左上的点。

左上的点满足 \(x_i\ge x_j,y_i>y_j\),因此式子变成 $\sum_{j=1}^{n} (x_i-x_j+y_i-y_j)^2=\sum_{j} (x_i+y_i)2+(x_j+y_j)2-2(x_i+y_i)(x_j+y_j)=cnt_{x_i,y_i}(x_i+y_i)^2-2(x_j+y_j)(\sum_{j} x_j+y_j)+\sum_{j} (x_j+y_j)^2 $。

因此我们只需要维护 \(cnt_{x_i,y_i}\) 表示点 \(i\) 左上的点的个数;\(sum_{x_i,y_i}\) 表示左上的点的 \(x_j+y_j\) 之和;\(ans_{x_i,y_i}\) 表示左上的点的 \(x_j+y_j\) 的平方之和。就可以 \(O(1)\) 求出答案了。

这是一个二维偏序问题,可以扫描线 + 树状数组做。

扫描线 \(x\) 从小到大扫描,树状数组以 \(y\) 为下标,需要离散化。详见代码。

时间复杂度 \(O(n\log n)\)。

其实赛中我想到的是普通莫队,就是没想到旋转坐标系,分四类导致代码过于赤石,写了 2h 之后改去写暴力了。虽然但是我暴力也挂了 30pts

还是维护 \(cnt,sum,ans\),横坐标或者纵坐标转移一个单位通过预处理可以达到 \(O(1)\) 时间复杂度,因此可以莫队,时间复杂度 \(O\sqrt{n}\)。当然还是扫描线更好。

code

#include<bits/stdc++.h>
#define sf scanf
#define pf printf
#define rep(x,y,z) for(int x=y;x<=z;x++)
using namespace std;
typedef long long ll;
const int N=1e5+7,mod=998244353;
ll add(ll a,ll b){
    return ((a+b)%mod+mod)%mod;
}
struct node{
    int id,x,y;
    ll sum,ans;
    void turn(){
        swap(x,y),y=-y;
        sum=add(x,y);
        ans=sum*sum%mod;
    }
}a[N];
int b[N];
int m;
int n;
int x,y;
bool cmp(node a,node b){
    return (a.x!=b.x?a.x<b.x:a.y<b.y);
}
struct Tree{
    int tr[N];
    void clear(){
        memset(tr,0,sizeof(tr));
    }
    void insert(int x,ll val){
        for(;x<=m;x+=x&-x) tr[x]=add(tr[x],val);
    }
    ll query(int x){
        ll s=0;
        for(;x;x-=x&-x) s=add(s,tr[x]);
        return s;
    }
}cnt,sum,ans;
int yy[N];
ll f[N];
void solve(){
    cnt.clear(),sum.clear(),ans.clear();
    rep(i,1,n) b[i]=a[i].y;
    sort(a+1,a+n+1,cmp);
    sort(b+1,b+n+1);
    m=unique(b+1,b+n+1)-b-1;
    rep(i,1,n) yy[i]=lower_bound(b+1,b+m+1,a[i].y)-b;
    rep(i,1,n){
        ll cntu=cnt.query(yy[i]-1),
        sumu=sum.query(yy[i]-1),
        ansu=ans.query(yy[i]-1);
        f[a[i].id]=add(f[a[i].id],(a[i].ans*cntu%mod+ansu-2ll*a[i].sum*sumu%mod)%mod);
        cnt.insert(yy[i],1ll),sum.insert(yy[i],a[i].sum),ans.insert(yy[i],a[i].ans);
    }
}
void turn(){
    rep(i,1,n){
        a[i].turn();
    }
}
int main(){
    // freopen("in.txt","r",stdin);
    // freopen("my.out","w",stdout);
    sf("%d",&n);
    rep(i,1,n){
        sf("%d%d",&x,&y);
        a[i]={i,x,y,add(x,y),1ll*add(x,y)*add(x,y)%mod};
    }
    rep(i,0,3){
        solve();
        turn();
    }
    rep(i,1,n){
        pf("%lld\n",f[i]);
    }
}

标签:cnt,组十连测,day7,sum,2021,扫描线,左上,复杂度
From: https://www.cnblogs.com/liyixin0514/p/18435594

相关文章

  • 【20zr提高组十连测day10】心
    【20zr提高组十连测day10】心首先不同的操作序列一定在某个时刻使数组内容不同,因此我们只需要统计合法的操作序列数量。一个合法的最终数组形如若干个\(1,M\),而且\(1,M\)之间可能有若干个\(x\),长度为\(n+1\)。造成这个数组的操作序列必须满足所有操作\(1,M\)按顺序排列,......
  • 【20zr提高组十连测day10】信
    【20zr提高组十连测day10】信给定\(n,m\),\(n,m\le10^5\),给定分别长度为\(n-1,m,n,m-1\)的单调不减的序列\(A,B,C,D\),然后形如该图建边:考虑到序列是递增的,对于除最左上角以外的每个点,每个点一定要选和自己相连的一条边才能形成一棵树。那么选择左边或上边一定是更优的,而且......
  • [SWPUCTF 2021 新生赛]easy_md5
    分析一下代码, name不等于password,namd,md5值和password,md5值相等。get传参name,post传参password。$name!=$password&&md5($name)==md5($password)属于MD5绕过中的php==弱类型绕过有两个办法,第一个办法就是importrequests#网站的URLurl="http://node7.a......
  • 【2024潇湘夜雨】WIN10_LTSC2021_21H2.19044.4957软件选装纯净特别版9.26
    【系统简介】=============================================================1.本次更新母盘来自WIN10_LTSC2021_21H2.19044.4957.2.全程离线精简、无人值守调用优化处理制作。部分优化适配系统可能要重启几次,即使显示适配失败也不要在意,可能部分优化不适用。3.OS版本号为19044.49......
  • day7[XTuner 微调个人小助手认知任务]
    微调前用internlm2-chat-1_8b模型,通过QLoRA的方式来微调一个自己的小助手认知作为案例来进行演示......
  • java_day7_继承、final关键字、代码块、多态
    一、继承1、继承我想养一只......
  • AT_jsc2021_g Spanning Tree 题解
    感觉自己稍微有一点唐了。思路我们首先可以把一定要连的边连起来。这样就变成了一个无向图生成树计数问题。如何求解。使用矩阵树定理!我们可以求出基尔霍夫矩阵,然后跑一遍行列式就可以了。时间复杂度:\(O(n^3)\)。Code#include<bits/stdc++.h>usingnamespacestd;con......
  • 中国土地利用覆盖和变化数据集(1980-2021)
       该数据集通过融合森林资源清查数据和20种遥感土地利用产品,重建生成了1980-2015年中国森林覆盖数据集,空间分辨率为1×1公里。并且在此基础上进一步获得高精度森林覆被信息和土地利用覆盖数据集相融合,生成了中国1980-2021年土地利用覆盖和变化数据集,空间分辨率为10×10公......
  • 2007-2021年世界各国各行业全球价值链数据
    2007-2021年世界各国各行业全球价值链数据1、时间:2007-2021年2、指标:部门、sector、region、year、GVCpt_f(全球价值链前向参与度)、GVCpt_b(全球价值链后向参与度)、GVCposition(全球价值链地位指数)、GVCpt(全球价值链总参与度)3、来源:2007-2021年亚洲开发银行(ADB)数据库中记录的全......
  • Project 2021图文安装教程及下载
    MicrosoftProject是一个国际上享有盛誉的通用的项目管理工具软件,凝集了许多成熟的项目管理现代理论和方法,可以帮助项目管理者实现时间、资源、成本的计划、控制。MicrosoftProject不仅可以快速、准确地创建项目计划,而且可以帮助项目经理实现项目进度、成本的控制、分析和预......