学习了新姿势。。(一直看不懂大爷的代码卡了好久T T

  首先数字范围那么小可以考虑枚举众数来计算答案,设当前枚举到$x$,$s_i$为前$i$个数中$x$的出现次数,则满足$2*s_r-r > 2*s_l-l$的区间$[l+1,r]$其众数为$x$,这个显然可以用一个数据结构来维护。

  直接扫一遍效率是$O($数字种类数$*nlogn)$的,无法承受,但是我们发现,对于每一段非$x$的数,$2*s_i-i$是公差为$-1$的等差数列,所以它们对答案的贡献实际上可以一次性计算。设$L$为一段非$x$数的开头,$R$为结尾,则$\leq 2*s_R-R$的数贡献会被计算$len$次,$2*s_{R-1}-(R-1)$的数的贡献会被计算$len-1$次,...,$s_l-l$的数的贡献会被计算$1$次,这个贡献的计算次数也是个等差数列。

  那实际上我们有三种维护这个的方法。

  ①维护$a_i$表示$2*s_i-i$的出现次数,支持区间加和区间查询$\sum_{i=l}^r a_i*(i-l+1)$,较为麻烦,权值线段树。

  ②维护$s_i$表示$a_i$的前缀和,支持区间加一段等差数列和区间查询,挺可写,权值线段树。

  ③维护$s_i$的前缀和,支持区间加二次函数和单点查询,代码短但因为较抽象所以有些难调,树状数组,非常快。

  这里只说第三种写法,第一次见到这种操作...

  树状数组里实际上维护的是$s_1,s_1+s_2,s_1+s_2+s_3,...$,所以修改一段区间的时候,相当于给一段区间加上等差数列的求和,即$((1+i-l+1)*(i-l+1))/2=(i^2+(3-2l)i+l^2+3l+2)/2$,所以我们只要在树状数组上维护二次项,一次项和常数项,区间修改用差分,最后查询一段区间只要头尾相减就好了...

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#define ll long long
using namespace std;
const int maxn=;
int n, x, N, t;
int a[maxn], treety[maxn], pos[maxn], pre[maxn];
ll tree1[maxn], tree2[maxn], tree3[maxn], ans;
char buf[],*ptr=buf-;
inline int read()
{
char c=*++ptr;int s=,t=;
while(c<||c>)c=*++ptr;
while(c>=&&c<=){s=s*+c-'';c=*++ptr;}
return s*t;
}
inline void add(int x, int p)
{
x+=n+;
ll delta1=, delta2=-*x, delta3=1ll*x*x-*x+;
for(;x<=N;x+=x&-x)
{
if(treety[x]!=t) treety[x]=t, tree1[x]=tree2[x]=tree3[x]=;
tree1[x]+=delta1*p, tree2[x]+=delta2*p, tree3[x]+=delta3*p;
}
}
inline void query(int x, int ty)
{
x+=n+; int pos=x;
for(;x;x-=x&-x) if(treety[x]==t)
ans+=(tree1[x]*pos*pos+tree2[x]*pos+tree3[x])*ty;
}
inline void update(int l, int r, int s){add(*s-r, ); add(*s-l+, -);}
int main()
{
fread(buf,,sizeof(buf),stdin); n=read(); x=read(); N=n+n+;
for(int i=;i<=n;i++) x=read(), pre[i]=pos[x], pos[x]=i;
for(int i=;i<n;i++)
if(pos[i])
{
int cnt=; ++t;
for(int j=pos[i];j;j=pre[j]) a[++cnt]=j;
update(, a[cnt]-, );
for(int j=cnt;j;j--)
{
query(*(cnt-j+)-a[j]-, );
query(*(cnt-j+)-((j-)?a[j-]+:n+), -);
update(a[j], (j-)?a[j-]-:n, cnt-j+);
}
}
printf("%lld\n", ans>>);
}

「CodePlus 2017 11 月赛」Yazid 的新生舞会(树状数组/线段树)的更多相关文章

  1. 「CodePlus 2017 11 月赛」Yazid 的新生舞会

    n<=500000的数字,问有多少个区间的众数出现次数严格大于区间长度的一半. 这么说来一个区间就一个众数了,所以第一反应是枚举数字,对下标进行处理.然后没有第二反应.很好. 在枚举一个数字的时 ...

  2. loj #6250. 「CodePlus 2017 11 月赛」找爸爸

    #6250. 「CodePlus 2017 11 月赛」找爸爸 题目描述 小 A 最近一直在找自己的爸爸,用什么办法呢,就是 DNA 比对. 小 A 有一套自己的 DNA 序列比较方法,其最终目标是最 ...

  3. [LOJ 6249]「CodePlus 2017 11 月赛」汀博尔

    Description 有 n 棵树,初始时每棵树的高度为 H_i,第 i 棵树每月都会长高 A_i.现在有个木料长度总量为 S 的订单,客户要求每块木料的长度不能小于 L,而且木料必须是整棵树(即不 ...

  4. [LOJ 6248]「CodePlus 2017 11 月赛」晨跑

    Description “无体育,不清华”.“每天锻炼一小时,健康工作五十年,幸福生活一辈子” 在清华,体育运动绝对是同学们生活中不可或缺的一部分.为了响应学校的号召,模范好学生王队长决定坚持晨跑.不 ...

  5. 「CodePlus 2017 11 月赛」大吉大利,晚上吃鸡!(dij+bitset)

    从S出发跑dij,从T出发跑dij,顺便最短路计数. 令$F(x)$为$S$到$T$最短路经过$x$的方案数,显然这个是可以用$S$到$x$的方案数乘$T$到$x$的方案数来得到. 然后第一个条件就变 ...

  6. 「CodePlus 2017 11 月赛」可做题

    这种题先二进制拆位,显然改的位置只有每一段确定的数的开头和结尾,只需要对于每一个可决策位置都尝试一下填1和0,然后取min即可. #include<iostream> #include&l ...

  7. 「CodePlus 2017 11 月赛」大吉大利,晚上吃鸡!

    n<=50000,m<=50000的图,给s和t,问有多少点对$(a,b)$满足 嗯. 不会. 首先最短路DAG造出来,然后两个条件转述一下:条件一,$N_a$表示从s到t经过a的路径,$ ...

  8. LOJ6252. 「CodePlus 2017 11 月赛」大吉大利,晚上吃鸡! 最短路+bitset

    题目传送门 https://loj.ac/problem/6252 https://lydsy.com/JudgeOnline/problem.php?id=5109 题解 首先跑最短路,只保留 \( ...

  9. [LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞

    [LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞 试题描述 到河北省 见斯大林 / 在月光下 你的背影 / 让我们一起跳舞吧 うそだよ~ 河北省怎么可能有 Stalin. ...

随机推荐

  1. 高可用OpenStack(Queen版)集群-11.Neutron计算节点

    参考文档: Install-guide:https://docs.openstack.org/install-guide/ OpenStack High Availability Guide:http ...

  2. React Native移动开发实战-2-如何调试React Native项目

    在实际开发中,还有一个影响开发效率的重要因素:调试. 在1.4.3节中已经介绍了Enable Live Debugger的使用.本节来介绍另一个非常重要的调试选项:Debug JSRemotely选项 ...

  3. Spring Data REST PATCH请求远程代码执行漏洞(CVE-2017-8046) 本地复现方法

      #1背景 Spring Data REST是Spring Data项目的一部分,可以轻松地在Spring Data存储库之上构建超媒体驱动的REST Web服务. 恶意的PATCH请求使用精心构造 ...

  4. idea打断点是灰色的

    点击这个图标,debug的断点就是灰色的,debug功能被禁用

  5. BUAAMOOC-Alpha版本发布说明

    BUAAMOOC-Alpha版本发布说明 本说明为BUAAMOOCv1.0版发布说明. 软件截图 上届软件截图 可以看到上届的界面做的很简陋,对于登录.查看课程列表.观看视频等操作需要跳转多个页面,视 ...

  6. java布局学习(新)

    坚持学习java一段时间,最近自己需要做一个小型的系统,所以需要自己将自己的AWT知识巩固一下. 一.4大布局管理器. 1.边界布局BorderLayout 是JFrame和JDialog的默认布局方 ...

  7. BNUOJ 52308 We don't wanna work! set模拟

    题目链接: https://acm.bnu.edu.cn/v3/problem_show.php?pid=52308 We don't wanna work! Time Limit: 60000msM ...

  8. Xcode7~8版本过渡导致的问题

    现有项目是早期Xcode7编写的,一直到现在还是使用Xcode7编写.近期一位用户手机下载App出现闪退现象,该用户手机系统(iPhone 6 iOS8.1.2)经查实是由于CoreFoundatio ...

  9. poi读取Excel文件和图片

    首先得说一下,Excel文件是有03版和07版的区别的,也就是.xls和.xlsx,这两个文件需要分开读取. 其它的废话就不说了,直接贴代码: package util; import java.io ...

  10. 联想本win10 virtualbox 安装centos

    (1)必须开发操作系统虚拟化功能,参考该百度经验 https://jingyan.baidu.com/article/8275fc864d423e46a03cf638.html (2)调整虚拟机硬盘和 ...