思路:分治

提交:2次

错因:数组开小

题解:

我们枚举一下众数\(x\)。

设\(s[n]=\sum_{i=1}^n [a[i]==x]\)

那么对于区间\((l,r]\),有\(s[r]-s[l]>\frac{r-l}{2}\)

即\(2*s[r]-r>2*s[l]-l\)

考虑分治,我们求出所有过中点的区间\([l,r]\)的贡献。

如何求呢?首先观察一个性质,两个子区间的众数至少有1个是大区间的众数,反之亦然。

那么我们先求出子区间中的众数,作为大区间的可行众数。然后我们枚举每个可行众数,依次求出符合\(2*s[r]-r>2*s[l]-l\)的区间。

还有一个特别神的数组做法,可是我不会

代码:

#include<bits/stdc++.h>
#define ll long long
#define R register int
using namespace std;
namespace Luitaryi {
inline int g() { R x=0,f=1;
register char ch; while(!isdigit(ch=getchar())) f=ch=='-'?-1:f;
do x=x*10+(ch^48); while(isdigit(ch=getchar())); return x*f;
} const int N=500010;
int n,a[N],pos[N],num[N],cnt[N*2]; ll ans;
inline void solve(int l,int r) {
if(l==r) {++ans; return ;} R md=l+r>>1,tot=0;
solve(l,md),solve(md+1,r);
for(R i=md;i>=l;--i) if(++cnt[a[i]]>(md-i+1)/2)
if(!pos[a[i]]) num[pos[a[i]]=++tot]=a[i];//左边的众数
for(R i=l;i<=r;++i) cnt[a[i]]=0;
for(R i=md+1;i<=r;++i) if(++cnt[a[i]]>(i-md)/2)
if(!pos[a[i]]) num[pos[a[i]]=++tot]=a[i];//右边的众数
for(R i=l;i<=r;++i) pos[a[i]]=0;
for(R i=l;i<=r;++i) cnt[a[i]]=0;
for(R i=1;i<=tot;++i) {//枚举可能的众数
R sum=r-l+1,mx=sum,mn=sum;//mn,mx记录桶的上下界,sum作为初值相当于偏移量
cnt[sum]=1; for(R j=l;j<md;++j) {//先处理出左边的桶
a[j]==num[i]?++sum:--sum;
mx=max(mx,sum),mn=min(mn,sum); ++cnt[sum];
} a[md]==num[i]?++sum:--sum;
for(R j=mn;j<=mx;++j) cnt[j]+=cnt[j-1];//前缀和。
for(R j=md+1;j<=r;++j) {//处理右边
a[j]==num[i]?++sum:--sum;
ans+=cnt[min(mx,sum-1)]; //求出顺序对个数
} for(R j=mn;j<=mx;++j) cnt[j]=0;
}
} inline void main() {
n=g(); g(); for(R i=1;i<=n;++i) a[i]=g();
solve(1,n); printf("%lld\n",ans);
}
} signed main() {Luitaryi::main(); return 0;}

2019.10.08

38

P4062 [Code+#1]Yazid 的新生舞会的更多相关文章

  1. luogu P4062 [Code+#1]Yazid 的新生舞会(线段树+套路)

    今天原来是平安夜啊 感觉这题是道好题. 一个套路枚举权值\(x\),把权值等于\(x\)的设为1,不等于的设为-1,然后问题转化为多少个区间权值和大于. 发现并不是很好做,还有一个套路,用前缀和查分来 ...

  2. 洛谷 P4062 - [Code+#1]Yazid 的新生舞会 的线性做法

    洛谷题面传送门 一个线性做法. \(n\log n\) 解法可以戳这里查看 首先回顾一下 \(n\log n\) 解法的过程:我们对于每一个数 \(x\),考察其出现位置,设为 \(t_1,t_2,t ...

  3. 洛谷 P4062 - [Code+#1]Yazid 的新生舞会(权值线段树)

    题面传送门 题意: 给出一个序列 \(a\),求 \(a\) 有多少个子区间 \([l,r]\),满足这个区间中出现次数最多的数出现次数 \(>\dfrac{r-l+1}{2}\) \(1 \l ...

  4. 【线段树】【P4062】 [Code+#1]Yazid 的新生舞会

    Description 给定一个长度为 \(n\) 的序列,求有多少子区间满足区间众数严格大于区间长度的一半.如果区间有多个出现次数最多且不同的数则取较小的数为众数. Limitation 对于全部的 ...

  5. [题解] [Code+#1]Yazid 的新生舞会

    题面 题解 upd : \(cnt_i\) 代表值为 \(i\) 的个数 我们可以暴力枚举众数 \(k\) 把等于 \(k\) 的赋值成 1 , 不等于 \(k\) 的赋值成 -1 这样原序列就变成了 ...

  6. 【BZOJ5110】[CodePlus2017]Yazid 的新生舞会 线段树

    [BZOJ5110][CodePlus2017]Yazid 的新生舞会 Description Yazid有一个长度为n的序列A,下标从1至n.显然地,这个序列共有n(n+1)/2个子区间.对于任意一 ...

  7. bzoj5110: [CodePlus2017]Yazid 的新生舞会

    Description Yazid有一个长度为n的序列A,下标从1至n.显然地,这个序列共有n(n+1)/2个子区间.对于任意一个子区间[l,r] ,如果该子区间内的众数在该子区间的出现次数严格大于( ...

  8. [loj 6253] Yazid的新生舞会

    (很久之前刷的题现在看起来十分陌生a) 题意: 给你一个长度为n的序列A,定义一个区间$[l,r]$是“新生舞会的”当且仅当该区间的众数次数严格大于$\frac{r-l+1}{2}$,求有多少子区间是 ...

  9. 【bzoj5110】Yazid的新生舞会

    这里是 $THUWC$ 选拔时间 模拟赛的时候犯 $SB$ 了,写了所有的部分分,然后直接跑过了 $4$ 个大样例(一个大样例是一个特殊情况)…… 我还以为我非常叼,部分分都写对了,于是就不管了…… ...

随机推荐

  1. Java基础---Java 数组

    数组概念: 数组就是存储数据长度固定的容器,保证多个数据的数据类型要一致. 数组的定义 格式:数组定义格式详解: 数组存储的数据类型: 创建的数组容器可以存储什么数据类型. [] : 表示数组. 数组 ...

  2. Python循环的基本使用(for in、while)

    Python的循环有两种: 一种是for-in 循环:主要用于遍历tuple.list; 一种是while循环:只要条件满足,就不断循环,条件不满足时退出循环. #!/usr/bin/python # ...

  3. hdu 2167 题解

    题目 题意 一个数字正方形(所有数都是两位的正整数),取了一个数后,它的周围 $ 8 $ 个数都不能被选,问最大取数总和. 注意数据范围 $ 3=< n <=15 $ 我们可能一开始会去想 ...

  4. 应用编排服务之ELK技术栈示例模板详解

    日志对互联网应用的运维尤为重要,它可以帮助我们了解服务的运行状态.了解数据流量来源甚至可以帮助我们分析用户的行为等.当进行故障排查时,我们希望能够快速的进行日志查询和过滤,以便精准的定位并解决问题. ...

  5. HTTP响应状态码整理

    1xx:信息 100 Continue服务器仅接收到部分请求,但是一旦服务器并没有拒绝该请求,客户端应该继续发送其余的请求.101 Switching Protocols服务器转换协议:服务器将遵从客 ...

  6. 此方法显式使用的 CAS 策略已被 .NET Framework 弃用。若要出于兼容性原因而启用 CAS 策略,请使用 NetFx40_LegacySecurityPolicy 配置开关

    使用DEV8.3winform控件,框架从.net2.0升级到4.0后,程序报错,调用的目标异常. 此方法显式使用的 CAS 策略已被 .NET Framework 弃用.若要出于兼容性原因而启用 C ...

  7. Java 之 字节缓冲流

    一.字节缓冲输出流 java.io.BufferedOutputStream extends OutputStream BufferedOutputStream:字节缓冲输出流. 继承自父类的共性成员 ...

  8. TR-银行主数据相关BAPI

    BAPI_BANKDETAIL_CREATE FI01:BAPI_BANK_CREATE FI12:BAPI_HOUSE_BANK_REPLICATE 1011 Business Object Ban ...

  9. IOS开发之——绘图(CGContext)

    0 CGContextRef context = UIGraphicsGetCurrentContext(); 设置上下文 1 CGContextMoveToPoint 开始画线 2 CGContex ...

  10. MongoDB官方推荐的GUI工具-Compass的使用

    探索和操作MongoDB数据的最简单方法 用于MongoDB的GUI.可视化地查看数据.以秒为单位运行临时查询.使用完整的CRUD功能与数据交互.查看和优化查询性能.可在Linux.Mac或Windo ...