bzoj 5110 Yazid的新生舞会

news/2024/12/4 17:25:32/

题目大意:

一个数列,求有多少个区间$[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$轴建立权值线段树 发现中间连续的一段的贡献为一次函数

写一波一次函数即可

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<algorithm>
 7 #include<vector>
 8 #include<queue>
 9 #include<map>
10 #include<set>
11 #define rep(i,s,t) for(register int i=(s),i__end=(t);i<=i__end;++i)
12 #define dwn(i,s,t) for(register int i=(s),i__end=(t);i>=i__end;++i)
13 #define ren(x) for(register int i=fst[x];i;i=nxt[i])
14 #define pb(a,x) vec[a].push_back(x);
15 #define ll long long
16 #define inf 2139062143
17 #define MAXN 1001000
18 using namespace std;
19 inline int read()
20 {
21     int x=0,f=1;char ch=getchar();
22     while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
23     while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
24     return x*f;
25 }
26 int n,N,tp,g[MAXN],hsh[MAXN],m,tagk[MAXN<<2],tagb[MAXN<<2];
27 ll sum[MAXN<<2],ans;
28 vector <int> vec[MAXN];
29 inline ll calc(ll k,ll b,int x,int y) {return ((ll)((ll)k*y+k*x+2*b)*((ll)y-x+1))/2;}
30 void pshd(int k,int l,int r,int mid)
31 {
32     sum[k<<1]+=calc(tagk[k],tagb[k],l,mid);
33     sum[k<<1|1]+=calc(tagk[k],tagb[k],mid+1,r);
34     tagk[k<<1]+=tagk[k],tagk[k<<1|1]+=tagk[k],tagb[k<<1]+=tagb[k],tagb[k<<1|1]+=tagb[k];
35     tagk[k]=tagb[k]=0LL;
36 }
37 void mdf(int k,int l,int r,int a,int b,ll d,ll t)
38 {
39     if(l==a&&r==b) {tagb[k]+=t,tagk[k]+=d,sum[k]+=calc(d,t,l,r);return ;}
40     int mid=l+r>>1;if(tagb[k]!=0||tagk[k]!=0) pshd(k,l,r,mid);
41     if(b<=mid) mdf(k<<1,l,mid,a,b,d,t);else if(a>mid) mdf(k<<1|1,mid+1,r,a,b,d,t);
42     else {mdf(k<<1,l,mid,a,mid,d,t);mdf(k<<1|1,mid+1,r,mid+1,b,d,t);}
43     sum[k]=sum[k<<1]+sum[k<<1|1];
44 }
45 ll query(int k,int l,int r,int a,int b)
46 {
47     if(l==a&&r==b) return sum[k];
48     int mid=l+r>>1;if(tagb[k]!=0||tagk[k]!=0) pshd(k,l,r,mid);
49     if(b<=mid) return query(k<<1,l,mid,a,b);
50     else if(a>mid) return query(k<<1|1,mid+1,r,a,b);
51     else return query(k<<1,l,mid,a,mid)+query(k<<1|1,mid+1,r,mid+1,b);
52 }
53 void work(int x)
54 {
55     int t,las=0,pos;rep(i,1,vec[x].size()-1)
56     {
57         t=vec[x][i],pos=las-(t-vec[x][i-1])+1;
58         ans+=query(1,0,N,pos+n,las+n);
59         mdf(1,0,N,pos+n+1,las+n+1,1,-pos-n);
60         if(las+n+2<=N) mdf(1,0,N,las+n+2,N,0,las-pos+1);
61         las=pos+1;
62     }
63     las=0;rep(i,1,vec[x].size()-1)
64     {
65         t=vec[x][i],pos=las-(t-vec[x][i-1])+1;
66         mdf(1,0,N,pos+n+1,las+n+1,-1,pos+n);
67         if(las+n+2<=N) mdf(1,0,N,las+n+2,N,0,pos-las-1);
68         las=pos+1;
69     }
70 }
71 int main()
72 {
73     n=read(),N=(n<<1)+5,tp=read();rep(i,1,n) {g[i]=read();if(!hsh[g[i]]) hsh[g[i]]=++m;}
74     rep(i,1,m) pb(i,0);rep(i,1,n) pb(hsh[g[i]],i);rep(i,1,m) pb(i,n+1);
75     rep(i,1,m) work(i);printf("%lld\n",ans);
76 }
View Code

 

转载于:https://www.cnblogs.com/yyc-jack-0920/p/10166735.html


http://www.ppmy.cn/news/306988.html

相关文章

Nokia LCD 5110 移植(基于MSP430F5529)

今天也没什么想说的&#xff0c;因为某些事情忙的不行不行的。就偷个懒贴上自己移植的代码吧&#xff0c;希望能帮到初学者们。 头文件nokia_5110.h #ifndef __nokia_5110_h_ #define __nokia_5110_h_#include <msp430.h>#define LCD_5110_DIR P3DIR #defin…

hdu5110 dp

题意 给 了 一 个 矩 阵 然 后 &#xff0c; 潜 艇 可 以 向 前 在 西北和东北之间 的区域&#xff0c; 然后每个潜艇有一个值D &#xff0c;当到达潜艇距离为D的倍数的时候可以得到这个价值&#xff0c;这样我们1000*1000 的矩阵&#xff0c;D<1000, dp这么多显然是不可以的…

JoyStick Shield连接Nokia 5110--Arduino

SpaceTrash游戏是一个简单的射击游戏&#xff0c;您可以在其中控制宇宙飞船&#xff0c;并通过移动或爆破&#xff08;使用激光&#xff09;来避免漂浮在周围的小行星的碰撞。该游戏是u8g2图形库附带的示例&#xff0c;该图形库通常用于连接具有SPI或I2C协议的各种单色8位显示器…

P5110 块速递推

传送门 为啥我就没看出来有循环节呢…… 打表可得&#xff0c;这个数列是有循环节的&#xff0c;循环节为\(10^96\)&#xff0c;然后分块预处理&#xff0c;即取\(ksqrt(10^96)\)&#xff0c;然后分别预处理出转移矩阵\(A\)的\(A^1,A^2,...,A^{k-1}\)和\(A^k,A^{2k},...\)&…

STM32驱动Nokia5110

//以下是lcd5110.c #include "lcd5110.h" #include "english_6x8_pixel.h" //中文字库自己添加&#xff0c;如果没有请注释起来#include "write_chinese_string_pixel.h" //lcdgpio初始化函数 //GPIOC.0.9.10.11.12推挽输出&#xff0c;G…

linux驱动安装完桌面分辨率,kunbutu15.04安装后调整分辨率

在vbox里边安装了Kubuntu15.04虚拟机&#xff0c;安装过程还算顺利但是由于分辨率的问题&#xff0c;无法显示完全&#xff0c;折腾了我好一会&#xff0c;网上的说法可能只是应用于个人情况&#xff0c;所以我也记录下我的情况&#xff01; 我的本子是戴尔n5110 15寸的屏幕&am…

DELL笔记本安装windows10与deepin双系统详细图文教程

首先&#xff0c;我们的电脑上应该安装好了一个windows操作系统&#xff0c;我的系统是win10 1809版本。 工具&#xff1a; 1、装有win10系统的DELL电脑一台 2、4g以上的u盘一个 第一步 下载iso镜像 从deepin官网下载iso镜像&#xff0c;建议从百度云下&#xff0c;比较方…

arduino uno + nokia 5110

现在外面风雨交加&#xff0c;中午一盒隆江猪脚饭都没吃完的我饿得已经看不动QT的文档了&#xff0c;于是翻出实验室昨天入货的nokia5110玩下&#xff0c;显示个求救信号。 看图&#xff1a;NOKIA 5110 亲爱的arduino就不要爆照了 下面上过程&#xff0c;对于懒人来说&#xf…