首页 > 其他分享 >题解:AT_abc351_f [ABC351F] Double Sum

题解:AT_abc351_f [ABC351F] Double Sum

时间:2024-08-12 14:38:57浏览次数:6  
标签:ch int 题解 Sum 元素 abc351 maxn sum getchar

关于某c人士强制偷袭代码导致AT号被封,\({\color{red}\mathrm{警钟敲碎}}\)。

题意

一个长 \(n\) 的数组 \(a\),求所有顺序对中两元素之差的和。

分析

听说有大佬2min切掉。很明显,暴力过不去。

考虑计算每个元素的贡献。设 \(id\) 为该元素之前所有比它小的元素个数,\(sum\) 表示这些元素的和。因为要求所有差值的和,即理解为这个数乘上小于它的元素个数再减去比他小的数的和。那么此元素的贡献显然就是 \(a_i\times id-sum\)。

于是要维护 \(id\) 和 \(sum\)。我们可以用桶树状数组或者动态开点权值线段树,作者懒,用了前者。开两个桶树状数组,分别存储元素个数和元素之和。对于每个元素 \(a_i\),计算结果后让第一个桶添 \(1\),第二个桶添 \(a_i\)。

这道题就做完了。但是显然,由于 \(a_i\) 很大,所以需要离散化(这个应该不用讲了)。

Code

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
	int w=1,s=0;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
	while(isdigit(ch)){s=s*10+(ch-'0');ch=getchar();}
	return w*s;
}
const int maxn=4e6+10;
int n;
int a[maxn],li[maxn]; 
int cid[maxn*2],csum[maxn*2];
int lb(int x){return x&-x;}
void addid(int x,int y)
{
	for(;x<=maxn;x+=lb(x))cid[x]+=y;
}
int askid(int x)
{
	int ans=0;
	for(;x;x-=lb(x))ans+=cid[x];
	return ans;
}
void addsum(int x,int y)
{
	for(;x<=maxn;x+=lb(x))csum[x]+=y;
}
int asksum(int x)
{
	int ans=0;
	for(;x;x-=lb(x))ans+=csum[x];
	return ans;
}
signed main()
{
//  freopen("xxx.in","r",stdin);
//	freopen("xxx.out","w",stdout);
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		a[i]=read();
		li[i]=a[i];
	}
	sort(li+1,li+n+1);
	int tot=unique(li+1,li+n+1)-li-1,ans=0;
	for(int i=1;i<=n;i++)
	{
		int x=lower_bound(li+1,li+tot+1,a[i])-li;
		int id=askid(x-1),sum=asksum(x-1);
		ans=ans+a[i]*id-sum;
		addid(x,1);addsum(x,a[i]);
	}
	cout<<ans;
	return 0;
}

标签:ch,int,题解,Sum,元素,abc351,maxn,sum,getchar
From: https://www.cnblogs.com/Lydic/p/18307796

相关文章

  • tensorboard_logger库无法导入的问题解决
    一、问题描述最近在学习深度学习时,从大神们那里copy的代码中有用到tensorboard_logger这个库的东西,所以很自然地就用condainstall或者pip去安装它,但是结果是:python开源库里面没有这东西。这就让我很苦恼,所以只能自己动手,丰衣足食了。 二、解决方法首先找到tensorboard_logge......
  • ABC366 G - XOR Neighbors 题解
    发现题目实质上就是让你构造一组\(a_{1,2,\dots,n}\),有一些限制,要求一些\(a\)异或起来是\(0\)。看到\(n\le60\),果断列异或方程组,用异或高斯消元。具体地,有\(n\)个方程组,\(a_{i,j}\)表示第\(i\)个方程中\(j\)的系数。对于每一个变量\(i\),要把\(j>i\)的方程中的第......
  • 【题解】P3356 火星探险问题
    \(\large\mathfrak{1st.\Preamble|}\)前言这都什么年代了网络流24题居然还能写题解!个人认为这篇题解讲的还是比较详细的。\(\large\mathfrak{2nd.\Solution|}\)题解看到题目的第一眼,我的反应是这样的:这不跟深海机器人问题差不多吗?Ctrl-CCtrl-V秒了。不过我还是讲讲怎......
  • ABC366D 题解
    Solution题意简述给你一个正整数\(N\)和\(N^3\)个非负整数,表示为\(A_{x,y,z}\)其中\(1\leqx,y,z\leqN\)。您将得到以下格式的\(Q\)个查询,必须按顺序处理。对于第\(i\)次查询\((1\leqi\leqQ)\),您将得到一个整数元组\((Lx_i,Rx_i,Ly_i,Ry_i,Lz_i,......
  • 逆序对数列(P2513) - 题解
    [HAOI2009]逆序对数列原题链接题目描述对于一个数列\(\{a_i\}\),如果有\(i<j\)且\(a_i>a_j\),那么我们称\(a_i\)与\(a_j\)为一对逆序对数。若对于任意一个由\(1\simn\)自然数组成的数列,可以很容易求出有多少个逆序对数。那么逆序对数为\(k\)的这样自然数数列到底......
  • ABC366F Maximum Composition 题解
    ABC366FMaximumComposition题解题目大意给定\(N\)个一次函数\(f_i(x)=a_ix+b_i\),从中选出\(K\)个函数\(f_{p_1},f_{p_2},\dots,f_{p_K}\),使得\(f_{p_1}(f_{p_2}(\dotsf_{p_K}))\)最大,求最大值。Solve考虑这样一种情况:我已经选定\(p_{k+1},p_{k+1},\dots,p_K\),现......
  • ABC366F 题解
    Solution题意简述现在有\(N\)个线性函数\(f_1,\dots,f_N\)。函数\(f_i(x)=A_ix+B_i\)。找到一个长度为\(K\)的序列\(p=(p_1,\dots,p_k)\),序列元素为\(K\)个大小在\([1,N]\)的不同整数。输出\(f_{p_1}(f_{p_2}(\dotsf_{p_k}(1)\dots))\)可能的最大值。思路贪心......
  • 爱因斯坦求和约定einsum简单例题解读
    概论在爱因斯坦求和约定或einsum()格式字符串中,所有的索引都可以分为两类:自由索引集和求和索引集。它们的区别很简单:自由索引是用于输出规范中的索引。它们与外层for循环相关联。求和索引是所有其他索引:它们出现在参数规范中,但不出现在输出规范中。之所以称为求和索引,是因......
  • ABC366E 题解
    Solution题意简述二维平面上有\(N\)个点\((x_1,y_1),\dots,(x_N,y_N)\)和一个非负整数\(D\)。求有多少对点对\((x,y)\)满足\(\sum\limits_{i=1}^N(|x-x_i|+|y-y_i|)\leD\)。思路发现\(x_i\)与\(y_i\)的捆绑关系不强(其实是几乎没有关联),所以我们分开考虑,也就是先......
  • 记录JSch连接SFTP Exception:Algorithm negotiation fail问题解决
    问题描述:关于正式环境访问外网连接不成功 1、首先检查是否开放防火墙(已确认开放),策略开放后,通过命令连接是否畅通: 通过telnet命令,可以得出,访问畅通。telnet192.168.1.122 2、查看生产环境日志,观察生产环境访问外网服务器异常:抛出异常,提示:算法协商失败com.jcraft.j......