思路:分治

提交: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

最新文章

  1. SDWebImage的简单使用
  2. 使用easyui-layout布局
  3. destoon去掉会员注册email验证
  4. XML学习笔记2——DTD
  5. Force.com微信开发系列(四)申请Access Token及自定义菜单之创建菜单
  6. [Effective JavaScript 笔记]第32条:始终不要修改__proto__属性
  7. 基于redis实现的分布式锁
  8. Myeclipese改变背景色
  9. zabbix解决监控图中出现中文乱码问题
  10. SSRF
  11. [Unity动画]03.动画事件
  12. SMO详解
  13. mysql数据库----索引补充
  14. python __path__ 变量
  15. calculate fraction by oracle
  16. Spring基础使用(一)--------IOC、Bean的XML方式装配
  17. python 案例:使用BeautifuSoup4的爬虫
  18. python ConfigParser模块 配置文件解析
  19. Java8内置的四大核心函数式接口
  20. logback--How do I configure an AsyncAppender with code? 转载

热门文章

  1. 2019.10.16&amp;17小结
  2. JS实现可用滑块滑动的缓动图
  3. C++中深拷贝与浅拷贝
  4. C语言下进制的使用
  5. 使用Docker搭建svn服务器教程
  6. 3.asp.net core 关键概念
  7. copy 合并
  8. JS权威指南读书笔记(三)
  9. 1+X证书学习日志——盒模型
  10. U盘因格式化 NTFS 中断造成无法识别,生产平台同样无法识别的修复处理方案