P8330-[ZJOI2022]众数【根号分治】

正题

题目链接:https://www.luogu.com.cn/problem/P8330


题目大意

给出一个长度为nnn的序列aaa,你可以选择其中一个区间将其加上任意整数,要求这个序列的众数出现次数最多。

输出最多次数和可能的众数。

1≤n≤2×105,1≤ai≤109,∑n≤5×1051\leq n\leq 2\times 10^5,1\leq a_i\leq 10^9,\sum n\leq 5\times 10^51n2×105,1ai109,n5×105,保证不所有数都相等。


解题思路

相当于找到一个区间使得区间外和区间内的众数次数和最大。

这个和出现次数挂钩,考虑根号分治。对于出现次数大于n\sqrt nn的数字,这种数字不会超过n\sqrt nn个,可以考虑对每个数字暴力做。

假设在区间外的数字是xxx,区间内的是yyy,那么我们区间中每个xxx会令答案−1-11,每个yyy会令答案+1+1+1。将xxx的位置视为−1-11yyy的位置视为111,那么最大答案就是xxx的出现次数加最大子段和。

这个复杂度可以做到min(cx,cy)min(c_x,c_y)min(cx,cy),其中cxc_xcx表示xxx的出现次数。

那对于每个cx>nc_x>\sqrt ncx>n的我们都可以O(n)O(n)O(n)解决它在外或者在内的情况。

然后考虑cx≤nc_x\leq \sqrt ncxncy≤nc_y\leq \sqrt ncyn的情况,先把所有cx>nc_x>\sqrt ncx>nxxx给去掉,此时注意到任何区间的众数个数都是≤n\leq \sqrt nn的,那么我们预处理出fl,if_{l,i}fl,i表示一个最小的rrr,满足[l,r][l,r][l,r]的众数出现次数为iii,这样我们对于每个在外面的xxx枚举两个xxx的位置作为端点,然后单指针移动计算他们之间区间的众数出现次数即可。

时间复杂度:O(nn)O(n\sqrt n)O(nn)


解题思路

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
#include<vector>
#include<cmath>
using namespace std;
const int N=2e5+10,M=450;
int n,T,a[N],b[N],r[N][M],s[N];
vector<int> v[N],pr[N];
int read(){int x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-f;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}
void calc(int x,int y){int ans1=0,ans2=0,now1=0,now2=0,las=0;for(int i=0;i<v[y].size();i++){now1=max(now1+s[v[y][i]]-s[las],0);ans1=max(ans1,now1);now1=max(now1-1,0);now2=max(now2-s[v[y][i]]+s[las],1);ans2=max(ans2,now2);las=v[y][i];}pr[ans1+v[y].size()].push_back(y);pr[ans2+v[x].size()].push_back(x);return;
}
int main()
{
//	freopen("mode_ex2.in","r",stdin);int cas=read();while(cas--){n=read();T=445;for(int i=1;i<=n;i++)pr[i].clear(),v[i].clear();for(int i=1;i<=n+1;i++)for(int j=0;j<T;j++)r[i][j]=n+1;for(int i=1;i<=n;i++)a[i]=read(),b[i]=a[i];sort(b+1,b+1+n);int m=unique(b+1,b+1+n)-b-1;for(int i=1;i<=n;i++){a[i]=lower_bound(b+1,b+1+m,a[i])-b;v[a[i]].push_back(i);}for(int x=1;x<=m;x++){pr[v[x].size()].push_back(x);if(v[x].size()>T){for(int i=1;i<=n;i++)s[i]=0;for(int i=0;i<v[x].size();i++)s[v[x][i]]++;for(int i=1;i<=n;i++)s[i]+=s[i-1];for(int i=1;i<=m;i++)if(i!=x)calc(x,i);}}for(int x=1;x<=m;x++){if(v[x].size()<=T){for(int i=0;i<v[x].size();i++)for(int j=i;j<v[x].size();j++)r[v[x][i]][j-i]=v[x][j];}}for(int i=n;i>=1;i--)for(int j=0;j<T;j++)r[i][j]=min(r[i][j],r[i+1][j]);for(int x=1;x<=m;x++){if(v[x].size()<=T){for(int i=-1;i<(int)v[x].size();i++){int l=(i==-1)?0:v[x][i];l++;for(int j=0,z=i+1;j<T;j++){if(r[l][j]>n)break;while(z<v[x].size()&&v[x][z]<=r[l][j])z++;pr[v[x].size()+j+1-(z-i-1)].push_back(x);}}}}int ans=0;for(int i=n;i>=1;i--)if(pr[i].size()){ans=i;break;}printf("%d\n",ans);sort(pr[ans].begin(),pr[ans].end());printf("%d\n",b[pr[ans][0]]);for(int i=1;i<pr[ans].size();i++)if(pr[ans][i-1]!=pr[ans][i])printf("%d\n",b[pr[ans][i]]);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317371.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为云.NET Core支持情况调查

各大公有云都提供了开发者开发的SDK&#xff0c;今天我们来看看华为云对.NET Core的支持情况怎么样&#xff1f; .NET SDK地址 https://developer.huaweicloud.com/sdk#.NET华为云的.NET SDK相比其他语言少的可伶&#xff0c;而且这几个SDK还不支持.NET Core。SDK的支持实在太差…

[2021-07-19 内测NOIP] 操作(状压DP),异或(字典树),等级(线段树),矩阵(DP)

[2021-07-19 内测] NOIP操作descriptionsolutioncode异或descriptionsolutioncode等级descriptionsolutioncode矩阵descriptionsolutioncode操作 description 有n堆石子&#xff0c;每堆石子都有一定的数量&#xff0c;第i堆石子的数量用Ai表示。 任意两堆石子均可合并&…

codeforces:1361(div1)1362(div2):总结

文章目录前言1362-A. Johnny and Ancient Computer解析1362-B - Johnny and His Hobbies解析1362-C - Johnny and Another Rating Drop解析1361-A Johnny and Contribution解析1361-B - Johnny and Grandmaster解析1361-C - Johnny and Megans Necklace解析1361-D - Johnny and…

2018沈阳区域赛

题目地址 题号题目知识点难度ASockpuppetsBSequences GeneratorCInsertion Sort找规律&#xff0c;推公式DDiameter of a TreeEThe Kouga Ninja ScrollsFCounting Sheep in Ami DongsuoGBest ACMer Solves the Hardest Problem思维暴力HRainbow GraphIDistance Between Sweeth…

.NET和Java之争

这几天连续有多篇文章诋毁.NET&#xff0c;这类文章我十几年前就看得多了&#xff0c;只不过十几年前是C和C之争&#xff0c;C和Java之争。我从来不理这类文章&#xff0c;因为这类口水战并没有什么实际意义。然而接连收到多位粉丝私聊说&#xff0c;主席&#xff0c;你应该写点…

P8329-[ZJOI2022]树【容斥,dp】

正题 题目链接:https://www.luogu.com.cn/problem/P8329 题目大意 有两棵nnn个点的有根树。 第一棵根为111&#xff0c;第iii个点的父亲在[1,i−1][1,i-1][1,i−1]中。第二棵根为nnn&#xff0c;第iii个点的父亲在[i1,n][i1,n][i1,n]中。每个点都恰好在一棵树中作为叶子。 …

线性代数一之矩阵转向量随机化求解——神奇的矩阵(BZOJ)+向量内积

向量随机化神奇的矩阵descriptionsolutioncode[NOI2013]向量内积descriptionsolutioncode矩阵既可以看成是一张数位表&#xff0c;也可以看成是若干个行向量或者若干个列向量的向量表神奇的矩阵 description solution 暴力做A∗BA*BA∗B会达到n3n^3n3的复杂度&#xff0c;难…

G - Best ACMer Solves the Hardest Problem Gym - 101955G

G - Best ACMer Solves the Hardest Problem Gym - 101955G 题意&#xff1a; 我们需要建立一个数据库以支持实时查询和修改。这个数据库中的记录是点坐标 (x,y) 和其权值 w。查询与修改操作可以表示为 1 x y w&#xff0c;在 (x,y) 处插入一个新的点&#xff0c;我们保证在…

模板:Link Cut Tree(LCT)

文章目录前言解析原理rotate(x)splay(x)access(x)findroot(x)makeroot(x)split(x,y)link(x,y)cut(x,y)pushdown(x)完整代码所谓Link Cut Tree&#xff0c;就是林可卡特发明的tree &#xff08;逃&#xff09; 前言 终于走到了这一天… 其实感觉没有预想的那么难&#xff08;单…

P6803-[CEOI2020]星际迷航【博弈论,dp,矩阵乘法】

正题 题目链接:https://www.luogu.com.cn/problem/P6803 题目大意 给出一棵nnn个点的树&#xff0c;把它复制出D1D1D1层&#xff0c;编号为[0,D][0,D][0,D]&#xff0c;然后每一层随机一个点向下一层随机一个点连边。 然后从第000层的111号点出发&#xff0c;两个人轮流操作…

潘淳:国士无双《微软技术俱乐部(苏州)成立大会暨微软技术交流会介绍》附专题视频...

题记&#xff1a;凡我赶不上的&#xff0c;我就在未来等他&#xff0c;随时等待捕捉那个趋势的的到来。2019年立一个FLAG&#xff0c;加入一个成长性组织&#xff0c;一个能让我学习使我成长的平台。2019年你和我都将亲历这个组织的到来&#xff0c;一个属于苏州程序员自己的大…

ASP.NET Core中借助CSRedis实现安全高效的分布式锁

引言最近回头看了看开发的.NET Core 2.1项目的复盘总结&#xff0c;其中在多处用到Redis实现的分布式锁&#xff0c;虽然在OnResultExecuting方法中做了防止死锁的处理&#xff0c;但在某些场景下还是会发生死锁的问题&#xff0c;下面我只展示部分代码&#xff1a;问题&#x…

L Machining Disc Rotors

L Machining Disc Rotors 题意&#xff1a; 圆心为(0,0)半径为R的圆&#xff0c;现在被被n个互不相交的圆切割(圆心和半径会给出)&#xff0c;保证这n个彼此之间不会交叉&#xff0c;保证n个圆中不会有某个包含整个大圆的情况。问切割后大圆剩余部分的直径&#xff08;即两点…

线性代数二之矩阵加速DP——数学作业,Arc of Dream

矩阵加速数学作业descriptionsolutioncodeArc of Dreamdescriptionsolutioncode数学作业 description solution dpdpdp状态转移方程&#xff0c;dpidpi−1∗10lenii(modM)dp_{i}dp_{i-1}*10^{len_i}i\pmod Mdpi​dpi−1​∗10leni​i(modM) nnn巨大&#xff0c;分段矩阵加速 …

pjudge#21655-[PR #5]双向奔赴【状压dp】

正题 题目链接:http://pjudge.ac/contest/951/problem/21655 题目大意 给出一张nnn个点的简单无向图&#xff0c;每条边的两个方向具有不同权值。求一个权值和最小的定向方案使得整张图强连通。 1≤n≤18,−1≤ai,j≤1061\leq n\leq 18,-1\leq a_{i,j}\leq 10^61≤n≤18,−1≤…

YBTOJ洛谷P2387: 魔法森林(LCT)

解析 LCT从板子到算法的入门题吧 有一些不知道的很实用的技巧 把边按a排序从小到大加入边 那么我们只需要维护当前1-n路径上的b的最小值即可 如果这条边两端点本来不连通&#xff0c;就直接link 否则找到路径上b最大的一条边&#xff0c;断掉&#xff0c;再加入当前边&#x…

Shadow Properties之美(二)【Microsoft Entity Framework Core随笔】

接着上一篇Shadow Properties之美&#xff08;一&#xff09;&#xff0c;我们来继续举一个有点啰嗦的栗子。先看简单需求&#xff1a;某HR系统&#xff0c;需要记录员工资料。需要记录的资料有&#xff1a;员工号&#xff08;规则&#xff1a;分公司所在城市拼音首字母&#x…

K - Let the Flames Begin

K - Let the Flames Begin 题意&#xff1a; n个人围成一个环&#xff0c;编号分别是1~n&#xff0c;从第一个人开始报数&#xff0c;报道k的人被移除&#xff0c;然后下一个人从1重新报&#xff0c;一直这样进行。问第m给被移除的人报数是多少&#xff1f; 一共T组数据&…

CF1276F-Asterisk Substrings【SAM,线段树合并】

正题 题目链接:https://www.luogu.com.cn/problem/CF1276F 题目大意 给出一个长度为nnn的字符串SSS&#xff0c;现在依次进行如下操作 取出SSS的一个子串TTT。将TTT中的一个字符替换成∗*∗号&#xff08;也可以不替换&#xff09; 求最后有多少种不同的TTT。 解题思路 发…

线性代数三之状压DP的矩阵加速——Quad Tiling,Bus公交线路

状压与矩阵加速的藕断丝连Quad Tilingdescriptionsolutioncode[Hnoi2010]Bus 公交线路descriptionsolutioncodeQuad Tiling description solution 设dpi,S:dp_{i,S}:dpi,S​: iii列的状态为SSS的方案数&#xff0c;最后答案为dpn,(1<<4)−1dp_{n,(1<<4)-1}dpn,(…