当前位置: 首页 > news >正文

题解:P9388 [THUPC 2023 决赛] 先人类的人类选别

更差的阅读体验


考虑差分一下,变成查询一个前缀的和。操作是从左往右做的,所以很好。

经过简单的模拟可以发现,对一个前缀进行一次 \(x\) 的操作,也就是将 \(x\) 扔到前缀里面,然后把最小值扔掉。为啥要扔掉一个最小值?我们扔掉的数就是完成操作之后的 \(x\)

从这里我们可以看出,对于一个特定的前缀 \(i\),你把 \(x\) 一个一个塞进去,塞一个扔一个的作用效果,其实和塞 \(q\) 个扔 \(q\) 个的作用效果一样,因为实际上我们不关心顺序。所以假设我们进行到第 \(j\) 次操作,前 \(j\) 次操作的 \(x\) 分别是 \(x_1 \sim x_j\),那么我们做的事情其实是维护一个可重集,将 \(a_1 \sim a_i\) 扔进去,把 \(x_1 \sim x_j\) 扔进去,最后把前 \(j\) 小的扔掉。

我们要找一个前缀和一个 \(x\) 的可重集合并起来,前 \(j\) 小的和,不难想到权值线段树加主席树。

具体地,我们对静态的 \(a\) 序列维护主席树,对不断加入的 \(x\) 维护权值线段树。查询的时候,我们把某一个前缀对应的版本树和这个权值线段树加在一起,然后二分求前 \(i\) 小和即可。

复杂度 \(O(n \log n)\),完全不卡常。

#include<bits/stdc++.h>
#define endl '\n'
#define N 500006
using namespace std;
using i64=long long;
int n,q,tot,root,rt[N];
i64 s[N];
struct Node {int sz,ls,rs; i64 sum;} tree[N<<6];
void update(int &p,int q,int l,int r,int k)
{tree[p=++tot]=tree[q];tree[p].sz++,tree[p].sum+=k; if(l==r)return;int mid=l+r>>1; k<=mid?update(tree[p].ls,tree[q].ls,l,mid,k):update(tree[p].rs,tree[q].rs,mid+1,r,k);
}
void update(int &p,int l,int r,int k)
{if(!p)p=++tot; tree[p].sz++,tree[p].sum+=k; if(l==r)return;int mid=l+r>>1; k<=mid?update(tree[p].ls,l,mid,k):update(tree[p].rs,mid+1,r,k);
}
i64 query(int p,int q,int l,int r,int k)
{if(l==r)return 1ll*l*k;int mid=l+r>>1;int lsz=tree[tree[p].ls].sz+tree[tree[q].ls].sz;i64 lsum=tree[tree[p].ls].sum+tree[tree[q].ls].sum;if(lsz>=k)return query(tree[p].ls,tree[q].ls,l,mid,k);return lsum+query(tree[p].rs,tree[q].rs,mid+1,r,k-lsz);
}
main()
{scanf("%d%d",&n,&q);for(int i=1,x;i<=n;i++)scanf("%d",&x),update(rt[i],rt[i-1],1,n,x),s[i]=s[i-1]+x;for(int i=1,x,l,r;i<=q;i++){scanf("%d%d%d",&x,&l,&r),update(root,1,n,x);printf("%lld\n",s[r]-s[l-1]-query(rt[r],root,1,n,i)+query(rt[l-1],root,1,n,i));}return 0;
}
http://www.rkmt.cn/news/88578.html

相关文章:

  • 3步掌握:PDFMathTranslate与DeepSeek的终极PDF翻译方案
  • Wan2.2-Animate-14B:用AI技术实现电影级角色动画的完整指南
  • 20251212
  • WFU 保存小球为mask
  • os.sep是什么
  • 2025年12月山东玻璃加工中心、全自动异形玻璃磨边机、玻璃磨边设备、钻铣磨一体机厂家综合推荐榜单:十大优质厂商深度解析 - 2025年11月品牌推荐榜
  • SAP批量修改SPRO配置(针对按公司代码的配置项)
  • NL2SQL解决了?别闹了!大模型让你和数据库聊天背后的真相
  • 免费高效JSON/YAML文件翻译解决方案:json-translator全攻略
  • 2025年12月江苏新沂排水沟、排水槽、U型槽、盖板厂家综合推荐与选购指南 - 2025年11月品牌推荐榜
  • 2025年12月玻璃加工中心、全自动异形玻璃磨边机、玻璃磨边设备、钻铣磨一体机厂家推荐前五指南 - 2025年11月品牌推荐榜
  • 2025年12月江苏新沂排水沟、排水槽、U型槽、盖板厂家综合推荐与选择指南 - 2025年11月品牌推荐榜
  • Apache Airflow Docker镜像定制终极指南:从入门到精通
  • 2025超声波喷涂设备多少钱/超声波搅拌罐厂家联系方式/超声波分散机的应用领域有哪些/功能/处理量 - 品牌推荐大师1
  • 38、Linux系统的全面指南:获取、配置与应用
  • 2025年12月广东套管/绝缘套管/热收缩套管/热缩套管/热缩管品牌综合推荐与选购指南 - 2025年11月品牌推荐榜
  • 大模型训练新范式:Llama-Factory + 高性能GPU加速全流程实战
  • Klonsdif搜索TV浏览器:专为电视大屏优化的轻量级搜索工具
  • springboot基于vue的海产品溯源网站-来源产地_680tq4t3
  • 需求管理与项目管理一体化工具选型指南:如何选择最合适的解决方案
  • 2025年下半年上海iso9001认证、iso三体系认证、CE认证、iatf16949认证、iso27001认证服务全面评测与权威推荐指南 - 2025年11月品牌推荐榜
  • 【PPT模板】哪家好:2025年12月专业深度测评与排名前五推荐
  • 2025 年度西安网站制作公司推荐:定制开发与设计一站式服务机构口碑精选 - 朴素的承诺
  • springboot基于vue的贵州省铜仁地区乡村振兴综合管理系统_4p67u7m6
  • Bodymovin插件终极创意指南:让AE动画在网页上跳舞
  • Rust语言学习笔记
  • 计算机毕业设计springboot基于Java考研学习平台 基于SpringBoot的Java考研在线学习与资源分享系统 SpringBoot+Java实现的考研备考综合服务平台
  • CPU-Z TV版:轻量级硬件检测工具,完美支持电视遥控操作
  • 3、Kali Linux入门指南:基础操作与命令详解
  • BG3模组管理器终极指南:5分钟快速上手博德之门3模组管理