dp[i][j]:块i~块j的答案。 f[" />
(仓鼠与珂朵莉)https://ac.nowcoder.com/acm/problem/213938
我们发现是没有修改的。每次询问一个区间:区间每个数的权值=这个数*区间出现的次数。
问这个区间所有数权值的最大值。强制在线。
把a[i]离散化,我们考虑分块。
并且预处理出:
dp[i][j]" role="presentation">dp[i][j]:块i~块j的答案。
f[i][j]" role="presentation">f[i][j]:块1~块i。数字j出现的次数。
对于每次询问:我们分成3个部分。
要么答案是dp[i][j],要么这个数在两边的块中。
对于两边块的每个数,我们暴力统计出现的次数就可以了。
cpp
#include <bits/stdc++.h> #define LL long long using namespace std; int a[100005]; struct LSH { int b[100005]; int lsh(int a[], int n) { for(int i=1; i<=n; i++) b[i]=a[i]; sort(b+1, b+n+1); int cnt=unique(b+1, b+n+1)-b-1; for(int i=1; i<=n; i++) { a[i]=lower_bound(b+1, b+cnt+1, a[i])-b; } return cnt; } int id(int x) { return b[x]; } } Lsh; struct Fk{ int id[100005], pos[100005], len; int s[405][100005]; LL dp[405][405]; LL cut[100005]; void init(int n){ len=sqrt(n); for(int i=1; i<=n; i++){ id[i]=(i-1)/len+1; if(!pos[id[i]]) pos[id[i]]=i; } pos[id[n]+1]=n+1; for(int i=1; i<=n; i++){ s[id[i]][a[i]]++; dp[id[i]][id[i]]=max(dp[id[i]][id[i]], 1ll*Lsh.id(a[i])*s[id[i]][a[i]]); } for(int i=1; i<=id[n]; i++){ for(int j=1; j<100005; j++){ s[i][j]+=s[i-1][j]; } } for(int i=1; i<=id[n]; i++){ for(int j=i+1; j<=id[n]; j++){ LL mx=dp[i][j-1]; for(int k=pos[j]; k<min(n+1, pos[j+1]); k++){ cut[a[k]]++; mx=max(mx, Lsh.id(a[k])*(cut[a[k]]+s[j-1][a[k]]-s[i-1][a[k]])); } for(int k=pos[j]; k<pos[j+1]; k++){ cut[a[k]]--; } dp[i][j]=mx; } } } LL qeury(int L, int R){ LL mx=dp[id[L]+1][id[R]-1]; for(int i=L;i<=min(id[L]*len,R);i++){ cut[a[i]]++; if(id[R]>id[L]){ mx=max(mx, Lsh.id(a[i])*(cut[a[i]]+s[id[R]-1][a[i]]-s[id[L]][a[i]])); } else{ mx=max(mx, Lsh.id(a[i])*cut[a[i]]); } } if(id[L]!=id[R]){ for(int i=(id[R]-1)*len+1;i<=R;i++){ cut[a[i]]++; if(id[R]>id[L]){ mx=max(mx, Lsh.id(a[i])*(cut[a[i]]+s[id[R]-1][a[i]]-s[id[L]][a[i]])); } else{ mx=max(mx, Lsh.id(a[i])*cut[a[i]]); } } } for(int i=L;i<=min(id[L]*len,R);i++){ cut[a[i]]--; } if(id[L]!=id[R]){ for(int i=(id[R]-1)*len+1;i<=R;i++){ cut[a[i]]--; } } return mx; } }fk; int main() { int n, m; scanf("%d%d", &n, &m); for(int i=1; i<=n; i++) scanf("%d", &a[i]); Lsh.lsh(a, n); fk.init(n); LL last=0; while(m--){ int L, R; scanf("%d%d", &L, &R); L=(L^last)%n+1; R=(R^last)%n+1; if(L>R) swap(L, R); printf("%lldn", last=fk.qeury(L, R)); } return 0; }
__EOF__
本文作者: liweihang 本文链接: https://www.cnblogs.com/liweihang/p/14095994.html 关于博主: 评论和私信会在第一时间回复。或者直接私信我。 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处! 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。
相关知识
【Nowcoder】武汉大学2020年新生程序设计竞赛E 仓鼠与珂朵莉
玩仓鼠,写仓鼠,画仓鼠——我们和金珂臣这样与仓鼠相亲相爱
宠物小精灵DP粤语配音演员是谁啊 male or female
朵拉救援小宠物 小马宝莉特辑之彩虹舞蹈 巴拉拉小魔仙大电影
【帕朵猫猫饲养指南】
宠物小精灵dp官方下载
揭秘博美珂利犬的身世(探究博美与珂利犬的关系及其特点)
小莉宠物医院,小莉宠物医院东环店医生
神奇宝贝DP中,小光的神奇宝贝
马珂:猫与城
网址: 仓鼠与珂朵莉 分块+DP https://m.mcbbbk.com/newsview982812.html
上一篇: 专题策划丨猪病在线问诊“神器”全 |
下一篇: [华安证券]:农林牧渔行业周报: |