
每日一题-acwing小朋友排队(树状数组)
发布日期:2021-05-07 03:06:08
浏览次数:22
分类:精选文章
本文共 1044 字,大约阅读时间需要 3 分钟。
考虑用树状数组求解,简单的暴力会超时。
大概思路: 每个数会和前面比它大的数交换,会和后面比它小的数交换,所以每个数交换的总次数为前面比这个数大的数的个数+后面比这个数小的个数,下面的代码用b[i]维护这个个数和。如何求呢?
用树状数组保存每个数出现的次数。
第一次正向遍历,每次将数据出现的次数加入到树状数组中,并更新b[i],更新的值为当前遍历的个数减去小于a[i](当前数)的个数。 然后清空树状数组。 第二次逆向遍历,刚好可以找后面比a[i]小的数的个数,也是每次更新b[i]。 最后对整个b[i]进行等差数列求和的计算。#includeusing namespace std;typedef long long ll;const int maxn = 1e6+5;ll a[maxn],b[maxn];ll tr[maxn];int n;void update(int a,int b){ for(int i=a;i<=maxn;i+= (i&-i) ) tr[i] += b;}ll query(int x){ ll res = 0; for(int i=x;i;i -= (i&-i)) res += tr[i]; return res;}int main(){ cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++) { update(a[i],1); b[i] += i - query(a[i]);//比当前数大的个数 // cout< <<'\n'; } memset(tr,0,sizeof(tr)); for(int i=n;i>=1;i--) { update(a[i],1); b[i] += query(a[i]-1);//比当前数小的个数 // cout< <<'\n'; } ll ans = 0; for(int i=1;i<=n;i++) { ans += b[i]*(b[i]+1)/2; } cout< <<'\n'; return 0;}
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2025年03月25日 00时38分40秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
如何正确的在项目中接入微信JS-SDK
2021-05-09
初探WebAssembly
2021-05-09
关于Objects类的getClass方法为什么可以得到子类的地址的思考
2021-05-09
239. 滑动窗口最大值
2021-05-09
纵览全局的框框——智慧搜索
2021-05-09
手把手教你如何快速构建应用内消息推送与运营能力
2021-05-09
快服务流量之争:如何在快服务中占领一席之地
2021-05-09
【活动】直播揭秘<如何从0开发HarmonyOS硬件>
2021-05-09
Cocos平台集成AGC性能管理(二)—— 性能管理SDK集成
2021-05-09
华为推送服务 | 简单一招,提高用户活跃和留存
2021-05-09
基于Cocos SDKHub接入华为HMS Game服务—打包上架流程
2021-05-09
Unity平台 | 快速集成华为性能管理服务
2021-05-09
详细实例教程!集成华为虚假用户检测,防范虚假恶意流量
2021-05-09
对模拟器虚假设备识别能力提升15%!每日清理大师App集成系统完整性检测
2021-05-09
使用Power BI构建数据仓库与BI方案
2021-05-09
pytest封神之路第二步 132个命令行参数用法
2021-05-09
Django认证系统并不鸡肋反而很重要
2021-05-09
快用Django REST framework写写API吧
2021-05-09
tep用户手册帮你从unittest过渡到pytest
2021-05-09
12张图打开JMeter体系结构全局视角
2021-05-09