bzoj 5110 Yazid的新生舞会
题目大意:
一个数列,求有多少个区间$[l,r]$满足该区间的众数出现次数大于$\lceil \frac{r-l}{2} \rceil$
思路:
对于一个区间满足条件的众数明显是唯一的 所以设该数的前缀和数组为$S$
则一个区间$(l,r]$满足条件满足$2 \times (S_r-S_l)>(r-l)$ 移项后得到$2 \times S_r-r>2 \times S_l-l$
则对于$2 \times S_i-i$建立函数发现该函数由斜率为$\pm 1$组成
所有函数的关键点总数为$n$ 对于$y$轴建立权值线段树 发现中间连续的一段的贡献为一次函数
写一波一次函数即可
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<set>
#define rep(i,s,t) for(register int i=(s),i__end=(t);i<=i__end;++i)
#define dwn(i,s,t) for(register int i=(s),i__end=(t);i>=i__end;++i)
#define ren(x) for(register int i=fst[x];i;i=nxt[i])
#define pb(a,x) vec[a].push_back(x);
#define ll long long
#define inf 2139062143
#define MAXN 1001000
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) {x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,N,tp,g[MAXN],hsh[MAXN],m,tagk[MAXN<<],tagb[MAXN<<];
ll sum[MAXN<<],ans;
vector <int> vec[MAXN];
inline ll calc(ll k,ll b,int x,int y) {return ((ll)((ll)k*y+k*x+*b)*((ll)y-x+))/;}
void pshd(int k,int l,int r,int mid)
{
sum[k<<]+=calc(tagk[k],tagb[k],l,mid);
sum[k<<|]+=calc(tagk[k],tagb[k],mid+,r);
tagk[k<<]+=tagk[k],tagk[k<<|]+=tagk[k],tagb[k<<]+=tagb[k],tagb[k<<|]+=tagb[k];
tagk[k]=tagb[k]=0LL;
}
void mdf(int k,int l,int r,int a,int b,ll d,ll t)
{
if(l==a&&r==b) {tagb[k]+=t,tagk[k]+=d,sum[k]+=calc(d,t,l,r);return ;}
int mid=l+r>>;if(tagb[k]!=||tagk[k]!=) pshd(k,l,r,mid);
if(b<=mid) mdf(k<<,l,mid,a,b,d,t);else if(a>mid) mdf(k<<|,mid+,r,a,b,d,t);
else {mdf(k<<,l,mid,a,mid,d,t);mdf(k<<|,mid+,r,mid+,b,d,t);}
sum[k]=sum[k<<]+sum[k<<|];
}
ll query(int k,int l,int r,int a,int b)
{
if(l==a&&r==b) return sum[k];
int mid=l+r>>;if(tagb[k]!=||tagk[k]!=) pshd(k,l,r,mid);
if(b<=mid) return query(k<<,l,mid,a,b);
else if(a>mid) return query(k<<|,mid+,r,a,b);
else return query(k<<,l,mid,a,mid)+query(k<<|,mid+,r,mid+,b);
}
void work(int x)
{
int t,las=,pos;rep(i,,vec[x].size()-)
{
t=vec[x][i],pos=las-(t-vec[x][i-])+;
ans+=query(,,N,pos+n,las+n);
mdf(,,N,pos+n+,las+n+,,-pos-n);
if(las+n+<=N) mdf(,,N,las+n+,N,,las-pos+);
las=pos+;
}
las=;rep(i,,vec[x].size()-)
{
t=vec[x][i],pos=las-(t-vec[x][i-])+;
mdf(,,N,pos+n+,las+n+,-,pos+n);
if(las+n+<=N) mdf(,,N,las+n+,N,,pos-las-);
las=pos+;
}
}
int main()
{
n=read(),N=(n<<)+,tp=read();rep(i,,n) {g[i]=read();if(!hsh[g[i]]) hsh[g[i]]=++m;}
rep(i,,m) pb(i,);rep(i,,n) pb(hsh[g[i]],i);rep(i,,m) pb(i,n+);
rep(i,,m) work(i);printf("%lld\n",ans);
}
bzoj 5110 Yazid的新生舞会的更多相关文章
- 【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}$,求有多少子区间是 ...
- [BZOJ 4819] [SDOI 2017] 新生舞会
Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴. 有 \(n\) 个男生和 \(n\) 个女生参加舞会买一个男生和一个女生一起跳舞,互为舞伴. C ...
- 【bzoj5110】Yazid的新生舞会
这里是 $THUWC$ 选拔时间 模拟赛的时候犯 $SB$ 了,写了所有的部分分,然后直接跑过了 $4$ 个大样例(一个大样例是一个特殊情况)…… 我还以为我非常叼,部分分都写对了,于是就不管了…… ...
- BZOJ.5110.[CodePlus2017]Yazid 的新生舞会(线段树/树状数组/分治)
LOJ BZOJ 洛谷 又来发良心题解啦 \(Description\) 给定一个序列\(A_i\).求有多少个子区间,满足该区间众数出现次数大于区间长度的一半. \(n\leq5\times10^5 ...
- 【BZOJ5110】[CodePlus2017]Yazid 的新生舞会
题解: 没笔的时候我想了一下 发现如果不是出现一半次数而是k次,并不太会做 然后我用前缀和写了一下发现就是维护一个不等式: 于是就可以随便维护了
- 「CodePlus 2017 11 月赛」Yazid 的新生舞会(树状数组/线段树)
学习了新姿势..(一直看不懂大爷的代码卡了好久T T 首先数字范围那么小可以考虑枚举众数来计算答案,设当前枚举到$x$,$s_i$为前$i$个数中$x$的出现次数,则满足$2*s_r-r > 2 ...
- 【bzoj5110】[CodePlus2017]Yazid 的新生舞会 Treap
题目描述 求一个序列所有的子区间,满足区间众数的出现次数大于区间长度的一半. 输入 第一行2个用空格隔开的非负整数n,type,表示序列的长度和数据类型.数据类型的作用将在子任务中说明. 第二行n个用 ...
随机推荐
- SQLServer怎样把本地数据导入到远程服务器上(转载)
平常用到mssql时间比较少,总是过一段时间就忘记应该怎么操作了.当要做mssq把本地数据导入到远程服务器的时候,就去网上搜索很久都没有图解的,所以今天自己收集一下免得下次又到处去找.希望对自己,同时 ...
- ubuntu 14.04 安装npm
1. 安装 sudo apt install nodejs-legacy sudo apt install npm
- [洛谷P4556][BZOJ3307]雨天的尾巴-T3订正
线段树合并+树上差分 题目链接(···) 「简单」「一般」——其实「一般」也只多一个离散化 考试时想法看>这里< 总思路:先存所有的操作,离散化,然后用树上差分解决修改,用权值线段树维护每 ...
- APPScan-简单操作流程
图解安全扫描工具 AppScan使用 IBM Rational AppScan 是一个面向 Web 应用安全检测的自动化工具,使用它可以自动化检测 Web 应用的安全漏洞. 比如跨站点脚本攻击(C ...
- Navicat连接Oracle详细教程
Navicat Premium算是比较好的一个可视化数据库管理工具了,短小精悍,一个工具解决三种数据库的连接问题,真正做到了集成管理,对MySQL,SQLServer而言,连接比较简单,就不赘述了,现 ...
- CAD交互绘制矩形批注(网页版)
js中实现代码说明: 动态拖放时的绘制事件: function DynWorldDrawComment2( pCustomEntity,pWorldDraw, curPt) { // 得到绘制参数. ...
- Bootstrap历练实例:基本按钮组
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- javaEE(2)_http协议
一.HTTP协议简介 1.客户端连上web服务器后,若想获得web服务器中的某个web资源,需遵守一定的通讯格式,HTTP协议用于定义客户端与web服务器通迅的格式.dos环境下可直接通过telnet ...
- 用Python写一个小爬虫吧!
学习了一段时间的web前端,感觉有点看不清前进的方向,于是就写了一个小爬虫,爬了51job上前端相关的岗位,看看招聘方对技术方面的需求,再有针对性的学习. 我在此之前接触过Python,也写过一些小脚 ...
- 各种排序算法(JS实现)
目录: 直接插入排序.希尔排序.简单选择排序.堆排序.冒泡排序.快速排序,归并排序.桶排序.基数排序.多关键字排序.总结 JS测试代码 function genArr(){ let n = Math. ...