题解:AT_abc351_f [ABC351F] Double Sum
关于某c人士强制偷袭代码导致AT号被封,
题意
一个长
分析
听说有大佬2min切掉。很明显,暴力过不去。
考虑计算每个元素的贡献。设
于是要维护
这道题就做完了。但是显然,由于
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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】