题意

设 \(a\) 的价值为 \(a \times cnt_a\)(\(cnt_a\) 为 \(a\) 在区间中出现的次数),求区间种某种元素,使得这种元素的价值最大。

因为设计出现元素的次数,所以首先考虑莫队。

由于 Add 操作很好写,Del 操作不会写,所以我们考虑一种专门处理 Del 不容易处理的莫队:回滚莫队。

回滚莫队将询问区间分为两部分。设 \([L,R]\) 的左端点 \(L\) 所在块的右端点为 \(p\),则将区间分为 \([L,p]\) 和 \([p,R]\)。

我们发现对于左端点所在块不变的情况,右端点 $ R $ 是单调递增的,可以直接 Add;而左端点的数量级在 \(O(\sqrt n)\) 级别,我们可以先只计算右边的区间的贡献,然后向左 Add,最后撤回向左的 Add。

因为向左的操作只有 \(O(\sqrt n)\) 个,所以撤回操作的复杂度也是 \(O(\sqrt n)\) 的。

不过这道题有一点儿细节,具体见代码。

#include<algorithm>
#include<cstdio>
#include<cmath>
const int M=1e5+5;
int n,m,p,a[M],CB[M],lsh[M];long long cur,tmp,ans[M];
int len,v[M],mdf[M];bool vis[M];
inline long long max(const long long&a,const long long&b){
return a>b?a:b;
}
struct Query{
int L,R,p,id;
inline bool operator<(const Query&it)const{
return p==it.p?R<it.R:L<it.L;
}
}q[M];
inline void AddR(const int&val){
cur=max(cur,1ll*++CB[val]*lsh[val]);
}
inline void AddL(const int&val){
if(!vis[val]){
++len;mdf[len]=val;v[len]=CB[val];vis[val]=true;
}
tmp=max(tmp,1ll*++CB[val]*lsh[val]);
}
signed main(){
register int i,j,id;
scanf("%d%d",&n,&m);p=ceil(n/sqrt(2.0*m/3));
for(i=1;i<=n;++i)scanf("%d",a+i),lsh[++len]=a[i];
std::sort(lsh+1,lsh+len+1);len=std::unique(lsh+1,lsh+len+1)-lsh-1;
for(i=1;i<=n;++i)a[i]=std::lower_bound(lsh+1,lsh+len+1,a[i])-lsh;len=0;
for(i=1;i<=m;++i){
scanf("%d%d",&q[i].L,&q[i].R);
q[i].p=(q[i].L-1)/p+1;q[i].id=i;
}
std::sort(q+1,q+m+1);
for(i=1;i<=m;++i){
const int&QL=q[i].L,&QR=q[i].R;
if(i==1||q[i].p!=q[i-1].p){
for(j=1;j<=n;++j)CB[j]=0;
id=q[i].p*p;cur=0;
}
if((QL-1)/p==(QR-1)/p){
tmp=0;
for(j=QL;j<=QR;++j)AddL(a[j]);
}
else{
while(id<QR)AddR(a[++id]);tmp=cur;
for(j=QL;j<=q[i].p*p;++j)AddL(a[j]);
}
for(j=1;j<=len;++j)CB[mdf[j]]=v[j],vis[mdf[j]]=false;
ans[q[i].id]=tmp;len=0;
}
for(i=1;i<=m;++i)printf("%lld\n",ans[i]);
}

最新文章

  1. iOS面试题
  2. C# 6.0可能的新特性
  3. LUA 函数式编程demo
  4. 关于Oracle10G在库内导数据时,用到的更新语句----ZT
  5. ibatis XML标签的含义
  6. 移动H5页面,keyup事件不好使用处理解决
  7. tableView左滑删除功能
  8. CSS3发光字动画
  9. jquery 中 form的使用
  10. 一个基于node 的小demo
  11. 聊聊ThreadLocal原理以及使用场景-JAVA 8源码
  12. BZOJ1854: [Scoi2010]游戏 二分图
  13. go语言学习-常用命令(四)
  14. codeforces选做
  15. count性能
  16. mysql技巧:按条件筛选,然后替换
  17. aspnetcore2.1 部署到docker (访问出现404)
  18. java通过百度AI开发平台提取身份证图片中的文字信息
  19. Yet Another Maxflow Problem CodeForces - 903G (最小割,线段树)
  20. 【熊掌号mip插件】织梦DEDECMS百度熊掌号mip改造教程

热门文章

  1. ARP数据包分析
  2. Saas系统架构的思考,多租户Saas架构设计分析
  3. shell——read -u
  4. LeetCode随缘刷题之截断句子
  5. 操作系统发展史 &amp; 进程
  6. Solution -「LOJ #150」挑战多项式 ||「模板」多项式全家桶
  7. C#设置进程PATH环境变量值解决某些Win32DLL找不到路径问题
  8. 通过JAVA对FTP服务器连接,上传,下载,读取,移动文件等
  9. centos安装k8s集群
  10. 01_描述对象_类图(Class Diagram)