P4062 [Code+#1]Yazid 的新生舞会(分治做法)

P4062 [Code+#1]Yazid 的新生舞会

题意:

给出一个序列,求有多少个子区间满足众数的出现次数大于区间长度的一半
出现次数大于区间长度的一般我们称之为绝对众数

题解:

分治做法
对于一个区间[l,r],设mid=⌊l+r2⌋\lfloor \frac{l+r}{2} \rfloor2l+r,我们只需要求出所有经过mid的区间内能够成为众数的所有数,不横跨mid位置的子区间总会在一个二分统计中计算

有这样一个性质:如果x是区间[l,r]的绝对众数,对于l<=k<=r,x一定是区间[l,k]或区间(k,r]的众数
利用这个性质,我们可以令k=mid。

我们只需要求出区间[x,mid] (l<=x<mid)和区间[mid,y] (mid<y<=r)的众数,就可以得知所有横跨mid 的子区间的众数。这样就可以O(n)从mid出发往左右两边扫,求出所有能成为众数的数。

找出来的区间众数个数不会大于log(区间长度)

设当然枚举到的众数为nownum,问题就变成:有多少横跨mid的子区间中包含一半以上的nownum

这里用到一个高级的转化:我们将区间中不是nownum的数变成-1,是nownum的变成1,这样问题就变成:有多少横跨mid的子区间的和大于0
因为子区间横跨mid,我们设左端点为x(x一定在[l,mid]中),右端点为y(y一定在[mid+1,r]中)
我们求一个前缀和sum,如果子区间是符合要求的,那一定满足sum[y]-sum[x-1]>0,移项后sum[y]>sum[x-1],也就是对于每一个sum[y],有多少个sum[x-1]是符合要求的。我们可以开一个桶,把所有sum[x-1]存进去,然后桶求个前缀和,这样就可以O(1)直到有多少个sum[x-1]是小于sum[y]的了
sum[x-1]的前缀和有可能是负数,所以加一个偏移量n
递归树中,每一层区间长度加起来是n,可能的众数个数有log n个,每一层的复杂度是O(nlogn).总共有log n层,总复杂度是O(nlog2n)O(nlog^2n)O(nlog2n)

代码:

// Problem: P4062 [Code+#1]Yazid 的新生舞会
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P4062
// Memory Limit: 500 MB
// Time Limit: 4000 ms
// Data:2021-08-11 14:54:52
// By Jozky#include <bits/stdc++.h>
#include <unordered_map>
#define debug(a, b) printf("%s = %d\n", a, b);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
clock_t startTime, endTime;
//Fe~Jozky
const ll INF_ll= 1e18;
const int INF_int= 0x3f3f3f3f;
template <typename T> inline void read(T& x)
{T f= 1;x= 0;char ch= getchar();while (0 == isdigit(ch)) {if (ch == '-')f= -1;ch= getchar();}while (0 != isdigit(ch))x= (x << 1) + (x << 3) + ch - '0', ch= getchar();x*= f;
}
template <typename T> inline void write(T x)
{if (x < 0) {x= ~(x - 1);putchar('-');}if (x > 9)write(x / 10);putchar(x % 10 + '0');
}
void rd_test()
{
#ifdef ONLINE_JUDGE
#elsestartTime= clock();freopen("in.txt", "r", stdin);
#endif
}
void Time_test()
{
#ifdef ONLINE_JUDGE
#elseendTime= clock();printf("\nRun Time:%lfs\n", (double)(endTime - startTime) / CLOCKS_PER_SEC);
#endif
}
const int maxn= 5e5;
int a[maxn];
ll ans;
int n, m;
int num[maxn], t, tot[maxn];
int isnum[maxn];
int sum[maxn * 2];
void solve(int l, int r)
{if (l == r) {ans++;return;}int mid= (l + r) >> 1;solve(l, mid);solve(mid + 1, r);t= 0;for (int i= mid; i >= l; i--) {tot[a[i]]++; //记录出现次数//如果出现次数大于区间长度的一半,并且还没有加入过,就加入数组if (tot[a[i]] > (mid - i + 1) / 2) {if (!isnum[a[i]]) {isnum[a[i]]= 1;num[++t]= a[i];}}}for (int i= mid; i >= l; i--)tot[a[i]]= 0;for (int i= mid; i <= r; i++) {tot[a[i]]++;if (tot[a[i]] > (i - mid) / 2) {if (!isnum[a[i]]) {isnum[a[i]]= 1;num[++t]= a[i];}}}for (int i= l; i <= r; i++)tot[a[i]]= 0, isnum[a[i]]= 0;int s, nownum;for (int k= 1; k <= t; k++) {s= 0;nownum= num[k]; //枚举现在所有的众数sum[s + n]++;for (int i= l; i < mid; i++) {s+= (a[i] == nownum ? 1 : -1);sum[s + n]++;}s+= (a[mid] == nownum ? 1 : -1);int len= r - l + 1;for (int i= -len; i <= len; i++) {sum[i + n]+= sum[i + n - 1];}for (int i= mid + 1; i <= r; i++) {s+= (a[i] == nownum ? 1 : -1);ans+= sum[s + n - 1];}for (int i= -len; i <= len; i++) {sum[i + n]= 0;}}
}
int main()
{//rd_test();cin >> n >> m;for (int i= 1; i <= n; i++)cin >> a[i];solve(1, n);printf("%lld\n", ans);//Time_test();
}

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

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

相关文章

[CQOI2014] 危桥(网络流)

problem luogu-P3163 solution 这是一道网络流好题&#xff0c;看的着摸不着吃不着。 初读完题&#xff0c;就知道这是一道“脱光了”的最大流。 建图基础版本&#xff1a; 建立额外源汇点。 无向边相同于两条有向边&#xff0c;直接建不影响&#xff0c;危桥流量设成 22…

那些优秀的开发者----汪宇杰:从重视细节,到成就技术专家

汪宇杰&#xff08;Edi Wang&#xff09;&#xff0c;.NET及Windows开发者&#xff0c;2018-2019年度微软最有价值专家&#xff08;Windows Development方向&#xff09;。现担任某金融科技企业的网站开发工程师。他对微软技术有鉴定的信念和不灭的热情&#xff0c;曾在Windows…

P4062 [Code+#1]Yazid 的新生舞会(线段树做法)

P4062 [Code#1]Yazid 的新生舞会&#xff08;线段树做法&#xff09; 题意&#xff1a; 给你一个序列a[1…n]​&#xff0c;求存在绝对众数的子区间个数。 绝对众数指&#xff1a;区间中出现次数最多的那个数&#xff0c;出现次数严格大于区间长度的一半。 题解&#xff1a…

《从零开始学ASP.NET CORE MVC》课程介绍

大家好&#xff0c;欢迎来到52ABP学院&#xff0c;收看我们的 《从零开始学ASP.NET CORE MVC》。ASP.NET Core 简介从2015年开始随时互联网成长&#xff0c;云计算和AI、大数据的爆发&#xff0c;大家从谈论项目信息化到数字化的转型&#xff0c;从ToC产业到ToB产业的转型&…

[ZJOI2015] 地震后的幻想乡(状压dp + 期望)

problem luogu-P3343 solution dp(i):dp(i):dp(i): 当恰好加入第 iii 小边时候&#xff0c;所有点联通的方案数。 则 ans∑idpi(mi)im1ans\sum_i \frac{dp_i}{\binom mi}\frac{i}{m1}ans∑i​(im​)dpi​​m1i​ 。 重点是如何计算出 dp(i)dp(i)dp(i)。 这个恰好的限制不好…

P2152 [SDOI2009]SuperGCD

P2152 [SDOI2009]SuperGCD 题意&#xff1a; 求a和b的最大公约数 a,b<101000010^{10000}1010000 题解&#xff1a; 高精度&#xff0c;java高精度直接有模板&#xff0c;c高精度结合gcd的辗转相减法 对于&#xff1a;a,b的gcd(a,b)有&#xff1a; 若a为奇数&#xff0c…

Docker - 容器部署 Consul 集群

目录 准备 Consul 镜像安装单个 Consul组装集群 Consul启动 Consul 和 Web 管理器Consul 命令简单介绍Web 管理器Server 加入集群Client 加入集群了解 ConsulConsul 使用场景Consul 优势Consul 中的概念说明简介安装总结引用和附件说明本文主要介绍怎么使用 Docker 在 Linux…

[LOJ3153] 三级跳(单调栈 + 线段树)

problem loj3153 solution 有一个显然正确但又不起眼却是正解必备的结论&#xff1a; 考虑 (x,y,z)(x,y,z)(x,y,z) 答案三元对&#xff0c;如果有一个数 i∈(x,y)∧ai≥axi\in(x,y)\wedge a_i\ge a_xi∈(x,y)∧ai​≥ax​&#xff0c;那么 (i,y,z)(i,y,z)(i,y,z) 一定是不劣…

P2167 [SDOI2009]Bill的挑战

P2167 [SDOI2009]Bill的挑战 题意&#xff1a; 有n个长度一样的字符串&#xff0c;字符串的每一位是&#xff1f;或者确定的字母&#xff0c;&#xff0c;求与这 N 个串中的刚好 K 个串匹配的字符串 T 的个数 1<N<15,1<|S|<50 题解&#xff1a; 很明显状态dp 我…

VS2017创建ASP.NET Core Web程序

创建ASP.NET Core Web应用程序如果您使用的是VS2019 请看 VS2019创建ASP.NET Core Web程序在这个视频中我们将讨论可用的不同项目模板及其功能预制的项目模板有什么不同&#xff0c;哪些是可以使用的&#xff0c;以及他们的作用。在Visual Studio2017中创建新的ASP.NET Core 项…

[ZJOI2015] 幻想乡战略游戏(树链剖分 + 线段树二分 + 带权重心)

problem luogu-P3345 solution 这是一个带权重心的题&#xff0c;考察动态点分治。点分治&#xff1f;呵&#xff0c;不可能的&#xff0c;这辈子都不可能写点分治 我们重新考虑重心的性质&#xff1a;以这个点为根时&#xff0c;所有子树的大小不会超过整体大小的一半。 …

巧用linux版powershell,管理linux下的docker

owershell,docker,cli,命令,docker ps,docker image第一章 在linux中搭建docker环境目的&#xff1a;在任意版本的linux&#xff08;物理机&#xff0c;虚拟机&#xff0c;节点机&#xff09;中&#xff0c;安装docker服务。动作&#xff1a;教程略&#xff0c;不是本文主要目的…

P1972 [SDOI2009]HH的项链

P1972 [SDOI2009]HH的项链 题意&#xff1a; 给你一个序列&#xff0c;问这个序列中的种类数 n,m,ai<1e6 题解&#xff1a; 三个方法&#xff1a;莫队(会超时)&#xff0c;树状数组&#xff0c;主席树(会超时) 莫队就是裸题&#xff0c;不讲了&#xff0c;复杂度O(n*sq…

从ASP.NET Core2.2到3.0你可能会遇到这些问题

趁着假期的时间所以想重新学习下微软的官方文档来巩固下基础知识。我们都知道微软目前已经发布了.NET Core3.0的第三个预览版&#xff0c;同时我家里的电脑也安装了vs2019。So&#xff0c;就用vs2019.NET Core3.0来跟着做一下Contoso University这个WEB应用&#xff0c;但是在基…

【学习笔记】整体二分

文章目录引整体二分几道模板题Dynamic Rankings[ZJOI2013]K大数查询[国家集训队]矩阵乘法[THUPC2017] 天天爱射击[CTSC2018]混合果汁引 例1. 给定 nnn 个数 aia_iai​&#xff0c;一次询问&#xff0c;询问区间 [l,r][l,r][l,r] 中的第 kkk 小数。 我们通常想到二分答案&#x…

P2157 [SDOI2009]学校食堂

P2157 [SDOI2009]学校食堂 题意&#xff1a; 小F 的学校在城市的一个偏僻角落&#xff0c;所有学生都只好在学校吃饭。学校有一个食堂&#xff0c;虽然简陋&#xff0c;但食堂大厨总能做出让同学们满意的菜肴。当然&#xff0c;不同的人口味也不一定相同&#xff0c;但每个人…

EntityFramework Core 3.0 Preview

前段时间.Net Core 3.0 发布了&#xff0c;Entity Framework Core 3.0 也发布了Preview版。假期用了一上午大致研究了一遍&#xff0c;同时又体验了一把Visual Studio 2019。总结一下分享给大家&#xff1a;VS2019 新建.Net Core 3.0 Console应用&#xff0c;添加EFCore相关的N…

[luogu-P4299] 首都(并查集 + LCT动态维护树的重心 / 维护虚儿子信息)

problem luogu-P4299 solution 本题考察了很经典的模型&#xff0c;运用了很经典的解法。 本题用到了重心的两个性质&#xff1a; 两棵树合并为同一棵树时&#xff0c;新的重心一定在原来两棵树各自重心的路径上。 重心为根时的最大子树大小最小&#xff0c;不超过 siz/2s…

计算几何模板中的代码

计算几何模板代码选自kuangbin 7 计算几何 7.1 二维几何 // 计算几何模板 const double eps 1e-8; const double inf 1e20; const double pi acos(-1.0); const int maxp 1010; //Compares a double to zero int sgn(double x){if(fabs(x) < eps)return 0;if(x < …

机器学习 ML.NET 发布 1.0 RC

ML.NET 是面向.NET开发人员的开源和跨平台机器学习框架&#xff08;Windows&#xff0c;Linux&#xff0c;macOS&#xff09;,通过使用ML.NET,.NET开发人员可以利用他们现有的工具和技能组&#xff0c;为情感分析&#xff0c;推荐&#xff0c;图像分类等常见场景创建自定义机器…