Description

Yazid有一个长度为n的序列A,下标从1至n。显然地,这个序列共有n(n+1)/2个子区间。对于任意一个子区间[l,r]
,如果该子区间内的众数在该子区间的出现次数严格大于(r-l+1)/2(即该子区间长度的一半),那么Yazid就说这
个子区间是"新生舞会的"。所谓众数,即为该子区间内出现次数最多的数。特别地,如果出现次数最多的数有多个
,我们规定值最小的数为众数。现在,Yazid想知道,共有多少个子区间是"新生舞会的"

Input

第一行2个用空格隔开的非负整数n,type,表示序列的长度和数据类型。数据类型的作用将在子任务中说明。
第二行n个用空格隔开的非负整数,依次为A1,A2,...,An,描述这个序列。
N<=500000,0<=Type<=3
对于所有数据,保证 0 ≤ Ai ≤ n - 1。
对于 type = 0 的数据,没有任何特殊约定。
对于 type = 1 的数据,保证 Ai ∈ {0, 1}。
对于 type = 2 的数据,保证序列 A 的众数在整个序列中的出现次数不超过 15。
对于 type = 3 的数据,保证 Ai ≤ 7。

Output

输出一行一个整数,表示答案。

枚举众数的值a,一个区间(L,R]符合条件,当且仅当F(R)-F(L)>0,其中F(x)=2*([1,x]中a的个数)-x。

从左到右扫描x=1..n,插入F(x),查询F(<x)的和

F(x)在跨过a的出现位置时发生突变,其余时候x每+1,F(x)就-1,因此可以批量处理,每次插入和查询一个区间,算一下贡献可以转为区间加二次函数,单点查询,可以用树状数组维护

时间复杂度O(nlogn)

#include<bits/stdc++.h>
typedef long long i64;
const int N=5e5+;
char ib[N*],*ip=ib;
int _(){int x;scanf("%d",&x);return x;}
i64 ans=;
int n,mx;
struct pos{
int x,y;
}ps[N],pb[N];
void rsort(pos*a,pos*b,int n){
for(int t=;t<;t+=){
int ts[]={};
pos*rs[],*p=b;
for(int i=;i<n;++i)++ts[a[i].y>>t&];
for(int i=;i<;++i)rs[i]=p,p+=ts[i];
for(int i=;i<n;++i)*rs[a[i].y>>t&]++=a[i];
std::swap(a,b);
}
}
int tk;
struct node{
i64 s0,s1,s2;
int ed;
}bit[N*];
void inc(int w,int a){
w+=n+;
i64 a0=a*w*i64(w-),a1=a*i64(-w*),a2=a;
for(;w<=mx;w+=w&-w){
if(bit[w].ed!=tk){
bit[w]=(node){a0,a1,a2,tk};
}else{
bit[w].s0+=a0;
bit[w].s1+=a1;
bit[w].s2+=a2;
}
}
}
i64 sum(int w){
w+=n+;
int w0=w;
i64 s0=,s1=,s2=;
for(;w;w-=w&-w)if(bit[w].ed==tk){
s0+=bit[w].s0;
s1+=bit[w].s1;
s2+=bit[w].s2;
}
return (s2*w0+s1)*w0+s0;
}
void ins(int l,int r,int c){
inc(*c-r+,);
inc(*c-l+,-);
}
void que(int l,int r,int c){
ans+=sum(*c-l)-sum(*c-r);
}
void cal(pos*a,int n){
++tk;
ins(,a[].x,);
for(int i=;i<n;++i){
int w=a[i].x;
que(a[i].x,a[i+].x,i);
ins(a[i].x,a[i+].x,i);
}
que(a[n].x,::n+,n);
}
int main(){
n=_();_();
mx=n*+;
for(int i=;i<=n;++i)ps[i]=(pos){i,_()};
rsort(ps+,pb,n);
for(int i=,j=;i<=n;i=j){
for(++j;j<=n&&ps[i].y==ps[j].y;++j);
cal(ps+i-,j-i);
}
printf("%lld\n",ans/);
return ;
}

bzoj5110: [CodePlus2017]Yazid 的新生舞会的更多相关文章

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

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

  2. 【bzoj5110】Yazid的新生舞会

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

  3. 【BZOJ5110】[CodePlus2017]Yazid 的新生舞会

    题解: 没笔的时候我想了一下 发现如果不是出现一半次数而是k次,并不太会做 然后我用前缀和写了一下发现就是维护一个不等式: 于是就可以随便维护了

  4. 【bzoj5110】[CodePlus2017]Yazid 的新生舞会 Treap

    题目描述 求一个序列所有的子区间,满足区间众数的出现次数大于区间长度的一半. 输入 第一行2个用空格隔开的非负整数n,type,表示序列的长度和数据类型.数据类型的作用将在子任务中说明. 第二行n个用 ...

  5. BZOJ.5110.[CodePlus2017]Yazid 的新生舞会(线段树/树状数组/分治)

    LOJ BZOJ 洛谷 又来发良心题解啦 \(Description\) 给定一个序列\(A_i\).求有多少个子区间,满足该区间众数出现次数大于区间长度的一半. \(n\leq5\times10^5 ...

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

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

  7. [BZOJ5110]Yazid的新生舞会

    题目大意: 给你一个长度为$n(n\leq 5\times 10^5)$的序列$A_{1\sim n}$.求满足区间众数在区间内出现次数严格大于$\lfloor\frac{r-l+1}{2}\rflo ...

  8. 「CodePlus 2017 11 月赛」Yazid 的新生舞会(树状数组/线段树)

    学习了新姿势..(一直看不懂大爷的代码卡了好久T T 首先数字范围那么小可以考虑枚举众数来计算答案,设当前枚举到$x$,$s_i$为前$i$个数中$x$的出现次数,则满足$2*s_r-r > 2 ...

  9. bzoj 5110 Yazid的新生舞会

    题目大意: 一个数列,求有多少个区间$[l,r]$满足该区间的众数出现次数大于$\lceil \frac{r-l}{2} \rceil$ 思路: 对于一个区间满足条件的众数明显是唯一的 所以设该数的前 ...

随机推荐

  1. Element-ui 更新tableData 中 row的某一个属性时,没有更新视图的问题

    在一个报警音管理的页面中,每次点击试听的时候,需要把‘试听’ 更新为 ‘停止’, 起初我们给row.play=0时,显示为 试听,row.play=1时显示为停止, 但是在代码中每次为row.play ...

  2. SharePoint 2013 解惑 无法打开文件浏览器

    你有时候会看到这东西谈出来,当你想像管理文件一样,管理SharePoint上资源的时候 意思是说,不能打开文件浏览器,请加入你的站点到信任站点,这个有两个问题,一个是IE设置,一个是WebClient ...

  3. spring cloud_1_mm_eureka2 eureka集群

    一个eureka会出现单点故障 这里整两个 eureka--1 application.yml: #注册中心端口 server: port: 8888 #唯一标示eureka注册中心 方便互相识别 e ...

  4. nodejs连接阿里云物联网套件(mqtt)

    文档地址:https://help.aliyun.com/document_detail/73742.html   连接方法:先HTTPS认证再连接 /* *阿里云物联网套件nodejs连接示例 *C ...

  5. ubuntu18.04LTS修改键盘键位

    在Linux中为了敲命令方便,所以需要做一下键盘键位调整: 1.Esc键和`(即数字键1前面的那个键)对换: 2.Caps Lock键和左Control键对换: 编辑键位文件: sudo vim /u ...

  6. 测试那些事儿-Jmeter介绍及使用

    Jmeter与LR有啥区别? Jmeter工具组成部分: 1.资源生成器:用于生成测试过程中服务器,负载机的资源代码.(LR中的VuGen) 2.用户运行器:通常是一个脚本运行引擎,根据脚本要求模拟指 ...

  7. Maven&&Philosophy~

    What is Maven? At first glance Maven can appear to be many things, but in a nutshell Maven is an att ...

  8. java中数组实现的错误

    作为一个刚学java的小白 真是错误百出 下面就是一个大神会非常不屑的一个小错误 数组在初始化的时候仅仅是定义了一个数组,并未其中的内容初始化. 附上错误代码 : class student{publ ...

  9. jQuery 追加元素、拼接元素的方法总结(append、html、insertBefore、before等)

    1. append & appendTo 的功能均为:在被选元素结尾(仍在元素内部)插入指定内容,但是内容和选择器的位置不同 (1) append()方法: $("#test&quo ...

  10. PYTHON3-LIST.SORT(),SORTED()方法详解。

    python3对于排序提供两种内置方法,一是针对数组的list.sort(), 一是针对所有可迭代序列的sorted().其中list.sort()是在原数组修改,不产生新对象,所以在使用函数后使用赋 ...