P4062 [Code+#1]Yazid 的新生舞会
思路:分治
提交: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 的新生舞会的更多相关文章
- luogu P4062 [Code+#1]Yazid 的新生舞会(线段树+套路)
今天原来是平安夜啊 感觉这题是道好题. 一个套路枚举权值\(x\),把权值等于\(x\)的设为1,不等于的设为-1,然后问题转化为多少个区间权值和大于. 发现并不是很好做,还有一个套路,用前缀和查分来 ...
- 洛谷 P4062 - [Code+#1]Yazid 的新生舞会 的线性做法
洛谷题面传送门 一个线性做法. \(n\log n\) 解法可以戳这里查看 首先回顾一下 \(n\log n\) 解法的过程:我们对于每一个数 \(x\),考察其出现位置,设为 \(t_1,t_2,t ...
- 洛谷 P4062 - [Code+#1]Yazid 的新生舞会(权值线段树)
题面传送门 题意: 给出一个序列 \(a\),求 \(a\) 有多少个子区间 \([l,r]\),满足这个区间中出现次数最多的数出现次数 \(>\dfrac{r-l+1}{2}\) \(1 \l ...
- 【线段树】【P4062】 [Code+#1]Yazid 的新生舞会
Description 给定一个长度为 \(n\) 的序列,求有多少子区间满足区间众数严格大于区间长度的一半.如果区间有多个出现次数最多且不同的数则取较小的数为众数. Limitation 对于全部的 ...
- [题解] [Code+#1]Yazid 的新生舞会
题面 题解 upd : \(cnt_i\) 代表值为 \(i\) 的个数 我们可以暴力枚举众数 \(k\) 把等于 \(k\) 的赋值成 1 , 不等于 \(k\) 的赋值成 -1 这样原序列就变成了 ...
- 【BZOJ5110】[CodePlus2017]Yazid 的新生舞会 线段树
[BZOJ5110][CodePlus2017]Yazid 的新生舞会 Description Yazid有一个长度为n的序列A,下标从1至n.显然地,这个序列共有n(n+1)/2个子区间.对于任意一 ...
- bzoj5110: [CodePlus2017]Yazid 的新生舞会
Description Yazid有一个长度为n的序列A,下标从1至n.显然地,这个序列共有n(n+1)/2个子区间.对于任意一个子区间[l,r] ,如果该子区间内的众数在该子区间的出现次数严格大于( ...
- [loj 6253] Yazid的新生舞会
(很久之前刷的题现在看起来十分陌生a) 题意: 给你一个长度为n的序列A,定义一个区间$[l,r]$是“新生舞会的”当且仅当该区间的众数次数严格大于$\frac{r-l+1}{2}$,求有多少子区间是 ...
- 【bzoj5110】Yazid的新生舞会
这里是 $THUWC$ 选拔时间 模拟赛的时候犯 $SB$ 了,写了所有的部分分,然后直接跑过了 $4$ 个大样例(一个大样例是一个特殊情况)…… 我还以为我非常叼,部分分都写对了,于是就不管了…… ...
随机推荐
- JDK1.8 的 HashMap 源码之注意事项
文章目录 链表变树 树形结构与Comparable,性能极致与降低 链表与树之间转换的阈值 英语渣靠着翻译插件,大概翻译的,难免有错误之处,注意甄别: 链表变树 This map usually ac ...
- 长乐培训Day5
T1 圆圈舞蹈 题目 [题目描述] 熊大妈的奶牛在时针的带领下,围成了一个圈跳舞.由于没有严格的教育,奶牛们之间的间隔不一致. 奶牛想知道两只最远的奶牛到底隔了多远.奶牛A到B的距离为A顺时针走和逆时 ...
- 计算机网络--TCP协议深入理解
在近期学习计算机网络的过程中,由于知识点过于零散,琐碎,从而学习起来痛苦不堪,此贴只是总结了基于传输层的TCP协议相关的知识细节,并加入一点自己的理解,并无创新,若有理解不当之处,敬请提出,感谢! 首 ...
- PB学习笔记之随笔
1.根据条件改变字体颜色.if(curdate>=bdate and curdate<edate,rgb(255,0,0),if(sex=1, if(curdate>=mdate, ...
- jdk8新特性--函数式接口的使用
函数式接口的概念: 函数式接口的格式: 示例: 函数式接口的使用: 简化lambda表达式:
- dfs的剪枝优化
两个剪枝问题 1. 当两点的距离(需要走的步数)大于剩下的时间时 剪去 2.奇偶剪枝问题 如果起点到终点所需走的步数的奇偶性与时间奇偶性不同的时候 剪去 起点到终点步数的奇偶性的判断 首先 明确点的奇 ...
- Linux查找文件之Find命令
Linux系统文件中常用属性包括以下内容:名称,大小,权限,属主,属组,修改时间,访问时间等.在庞大的Linux系统中查询文件,需要借助查找工具来实现,依此可以查询相同或指定属性的文件,本文所讲的查询 ...
- idea+maven使用
maven 1. 打开软件,点击configure-project default-settings.配置maven目录. 后续还需要配置一个地方是本地仓库的优先,在runner-VM Options ...
- ubuntu无法安装usb驱动
第一步: 输入命令 lsusb 箭头指向的就是连接的手机 第二步: 输入命令,新建并打开文件 sudo gedit /etc/udev/rules.d/-android.rules [注意]如果提示没 ...
- TLS1.3对CIP的影响(对密码套件的解释)
1.术语定义的即使(算法)Definition of terms (optional) Cipher Suite :通信数据保护规范,对TLS指定对端身份验证,关键技术机制,后续数据加密和数据验证机 ...