P4062 [Code+#1]Yazid 的新生舞会(线段树做法)

题意:

给你一个序列a[1…n]​,求存在绝对众数的子区间个数。

绝对众数指:区间中出现次数最多的那个数,出现次数严格大于区间长度的一半。

题解:

这两个博客将的很长清楚明白(尤其是第一个),我在反复看了n遍后,终于明白。题目细节很多,我再怎么写也没这两个详细,干脆直接放上链接。
Zechariah的博客
OMG_wc 的博客
关于题解中提到的三阶前缀和:
三阶前缀和公式转换:
图来自lx_tyin博客

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const LL mod = 1e9 + 7;
const int N = 500005;
// 修改差分 来维护前缀和的前缀和
// c1 为差分d c2为d*i  c3 为d*i*i
LL c1[N * 2], c2[N * 2], c3[N * 2];
LL sum(int x) {LL res = 0;for (int i = x; i > 0; i -= i & -i) {res += c1[i] * (x + 2) * (x + 1) - c2[i] * (2 * x + 3) + c3[i];}return res / 2;
}
void add(int x, LL d, int n) {for (int i = x; i <= n; i += i & -i) {c1[i] += d;c2[i] += d * x;c3[i] += d * x * x;}
}
int a[N];
vector<int> b[N];
int main() {int n;scanf("%d%*d", &n);for (int i = 1; i <= n; i++) {scanf("%d", &a[i]);b[a[i]].push_back(i);}const int wc = n + 1;  // 偏移量,把[-n,n] 平移到 [1,2n+1]LL ans = 0;for (int i = 0; i < n; i++) {b[i].push_back(n + 1);int last = 0;for (int j = 0; j < b[i].size(); j++) {//j表示i的个数int y = 2 * j - last + wc;int x = 2 * j - (b[i][j] - 1) + wc;// 查询 sum([1,t-1] 的权值和), 其中t在[x,y]范围内,ans += sum(y - 1) - (x >= 3 ? sum(x - 2) : 0);// [x,y] 这些数的权值+1add(x, 1, 2 * n + 1);add(y + 1, -1, 2 * n + 1);last = b[i][j];}//撤销操作last = 0;for (int j = 0; j < b[i].size(); j++) {int y = 2 * j - last + wc;int x = 2 * j - (b[i][j] - 1) + wc;add(x, -1, 2 * n + 1);add(y + 1, 1, 2 * n + 1);last = b[i][j];}}printf("%lld\n", ans);return 0;
}

P4062 [Code+#1]Yazid 的新生舞会(线段树做法)相关推荐

  1. P4062 [Code+#1]Yazid 的新生舞会(分治做法)

    P4062 [Code+#1]Yazid 的新生舞会 题意: 给出一个序列,求有多少个子区间满足众数的出现次数大于区间长度的一半. 出现次数大于区间长度的一般我们称之为绝对众数 题解: 分治做法 对于 ...

  2. 洛谷 - P4062 [Code+#1]Yazid 的新生舞会(推公式+线段树)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,现在要求存在 绝对众数 的子区间个数 所谓 绝对众数,就是对于区间 [l,r][l,r][l,r] 来说,存在一个数字的出现次数 cntc ...

  3. P4062 [Code+#1]Yazid 的新生舞会 树状数组维护三阶差分

    传送门 文章目录 题意: 思路: 题意: 给你一个序列aaa,让你求有多少个子区间满足存在一个数是这个区间的绝对众数,绝对众数指该数在区间内出现的次数严格大于r−l+12\frac{r-l+1}{2} ...

  4. P4062 [Code+#1]Yazid 的新生舞会(区间绝对众数+分治/树状数组维护高维前缀和)

    P4062 [Code+#1]Yazid 的新生舞会 杭电多校懂得都懂 Code1 分治 比较喜欢分治的做法,非常好写.skylee大佬题解 首先对于任何一个区间来说,由于两个端点不确定性非常难以一次 ...

  5. 子段乘积(逆元费马小定理)+线段树做法

    题解:一开始做这个题的时候想过尺取法,但是因为没有逆元的知识,不知道该如何不断删除左端元素.其实这题并不难想,设l,r为两端开始都置为1,当长度小于k的时候不断乘右端元素并取余,当长度等于k时删除左端 ...

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

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

  7. ZJOI2019 线段树

    ZJOI2019 线段树 题意: 题目传送门 题解: 来讲一个非常卡常的矩阵+线段树做法.首先转化一下题意,直接将\(2^m\)棵线段树建出来一定是不现实的,我们对于每一个节点,记录这个节点在所有线段 ...

  8. 树状数组、线段树、分块 在同一题目中的应用(Acwing 243)

    Acwing 243 输入样例: 10 5 1 2 3 4 5 6 7 8 9 10 Q 4 4 Q 1 10 Q 2 4 C 3 6 3 Q 2 4 输出样例: 4 55 9 15 树状数组做法 # ...

  9. [BZOJ4825][HNOI2017]单旋(线段树+Splay)

    4825: [Hnoi2017]单旋 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 667  Solved: 342 [Submit][Status ...

最新文章

  1. php循环不出数据,在thinkphp模板中循环数组没有循环出所需要的数据
  2. 左侧宽度固定,右侧宽度自适应-----两种布局样式
  3. win7NVIDIA显卡驱动升级时卡住
  4. 树莓派超声波车牌识别系统
  5. lstm中look_back的大小选择_LSTM 扫盲:长短期记忆网络解读及其 PyTorch 应用实现
  6. 2021年陕西高考成绩单招查询时间,2021年陕西高考录取结果什么时候出来,查询时间一览表...
  7. Python 进阶 —— 重访 tuple
  8. HTML中的select只读
  9. matlab colormap详解 (2
  10. PHP的新手语法介绍
  11. 分享一些使用电脑的小技巧
  12. 已解决:“apktool” W: invalid resource directory name:XXX\res navigation
  13. [blender]图片模糊不清楚怎么变清晰
  14. sh_gamit报错:error reading station a priori constrains
  15. 服务器2008r2启动修复,Windows Server 2008 R2原生启动试用
  16. 算法-经典趣题-三色球
  17. steam游戏开发_如何从Steam Cloud下载保存的游戏
  18. Orcal 用户权限
  19. 2d游戏设计,pygame 游戏开发
  20. 树莓派-3-制作音乐播放器+语音控制

热门文章

  1. 面对女人的喋喋不休时,男人内心的真实想法
  2. 不同对象的通话是时长​
  3. 《悦趣式连锁反应》玩转STEM教育!529块积木元件,N+1款炫酷模型
  4. 作业优先调度java代码_如何在触发它时在java代码中为hadoop作业设置优先级?
  5. 小甲鱼零基础入门python二十一课课后题_小甲鱼Python第二十一讲课后习题
  6. java 面相,java学习17-面相对象(多态)
  7. 百度云cdn设置州五年制大专_[百度云CDN]配置过程坑点集合
  8. 重言式判别c语言中文网,重言式判别 重言式判别源码及课程设计 c语言版.doc
  9. centos php.ini redis,CentOS下安装Redis及Redis的PHP扩展
  10. mysql设置表名字为占位符_这可能是把MySQL存储引擎讲解的最清楚的一篇文章了