D. Powerful array
D. Powerful array
题意
给定一个数列:a[i] (1<= i <= n) K[j]表示 在区间 [l,r]中j出现的次数。有t个查询,每个查询l,r,对区间内所有a[i],求sigma(K[a[i]] * K[a[i]] * a[i])。
分析
首先将区间分块,每块sqrt(n)个,先读入所有的查询,对查询进行排序:先按块序号从小到大,再按右端点的值从小大到排序。
按顺序读入查询,动态变更区间,以及区间的值。如果某个点出现了 x 次,出现 x + 1 次时,区间内增加(2 * x + 1) 。
跑了3000多ms,果然很暴力。
code
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1e6 + 5;
const int MAXT = 2e5 + 10;
ll a[MAXN];
ll cnt[MAXN];
ll ans[MAXT];
int L, R;
ll res;
struct node
{
int l, r, bid, id;
bool operator < (const node &other) const
{
if(other.bid == bid) return r < other.r;
return bid < other.bid;
}
}q[MAXT];
void query(int l, int r, int is)
{
if(is)
{
for(int i = l; i < L; i++)
{
res += ((cnt[a[i]] << 1) + 1) * a[i];
cnt[a[i]]++;
}
for(int i = R + 1; i <= r; i++)
{
res += ((cnt[a[i]] << 1) + 1) * a[i];
cnt[a[i]]++;
}
for(int i = L; i < l; i++)
{
cnt[a[i]]--;
res -= ((cnt[a[i]] << 1) + 1) * a[i];
}
for(int i = r + 1; i <= R; i++)
{
cnt[a[i]]--;
res -= ((cnt[a[i]] << 1) + 1) * a[i];
}
}
else
{
for(int i = l; i <= r; i++)
{
res += ((cnt[a[i]] << 1) + 1) * a[i];
cnt[a[i]]++;
}
}
L = l; R = r;
ans[q[is].id] = res;
}
int main()
{
int n, t;
scanf("%d%d", &n, &t);
int bsize = sqrt(n + 1);
for(int i = 1; i <= n; i++) scanf("%I64d", &a[i]);
for(int i = 0; i < t; i++)
{
scanf("%I64d%I64d", &q[i].l, &q[i].r);
q[i].bid = q[i].l / bsize;
q[i].id = i;
}
sort(q, q + t);
for(int i = 0; i < t; i++) query(q[i].l, q[i].r, i);
for(int i = 0; i < t; i++) printf("%I64d\n", ans[i]);
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· Sdcb Chats 技术博客:数据库 ID 选型的曲折之路 - 从 Guid 到自增 ID,再到
· Winform-耗时操作导致界面渲染滞后
· Phi小模型开发教程:C#使用本地模型Phi视觉模型分析图像,实现图片分类、搜索等功能
· 语音处理 开源项目 EchoSharp
· drools 规则引擎和 solon-flow 哪个好?solon-flow 简明教程