PS:如果读过题了可以跳过题目描述直接到题解部分
提交链接:洛谷 P8313 [COCI2021-2022#4] Izbori

题目

题目描述

Malnar 先生正在竞选县长,这个县一共有 nnn 栋房屋,每栋房屋里都住着一位居民。Malnar 先生知道,选举的赢家不一定是最好的候选人,而是在选举前举办的宴会最好的候选人。因此,在选举前几天,他将邀请第 lll 至 r(l≤r)r(l\le r)r(l≤r) 栋房屋内居住的居民,为他们准备一顿丰盛的晚餐。

Malnar 先生知道所有居民最喜欢吃的菜。在宴会上,他会准备大多数人喜欢的一道菜。如果一个人吃到了自己最喜欢吃的菜,将会投一票给 Malnar 先生。但是如果没有吃到自己最喜欢吃的菜,他们将会把票投给 Vlado 先生。如果没有来参加晚宴的居民,他们将会忘记选举,不做出任何投票。如果一个候选人获得了投了票的人中一半以上的人的支持,他将会赢得竞选。

Malnar 先生想知道,有多少组的 (l,r)(l,r)(l,r) 可以使他赢得竞选。

输入格式

第一行包含一个整数 nnn,表示房屋的数量。

第二行包含 nnn 个整数 aia_iai​,表示第 iii 栋房屋内居民最喜欢的菜。

输出格式

仅一行,输出可以使 Malnar 先生赢得竞选的 (l,r)(l,r)(l,r) 的组数。

样例 #1

样例输入 #1

2
1 1

样例输出 #1

3

样例 #2

样例输入 #2

3
2 1 2

样例输出 #2

4

样例 #3

样例输入 #3

5
2 2 1 2 3

样例输出 #3

10

提示

【样例 2 解释】

可以使 Malnar 先生赢得竞选的 (l,r)(l,r)(l,r) 为:(1,1),(2,2),(3,3),(1,3)(1, 1),(2, 2),(3, 3),(1, 3)(1,1),(2,2),(3,3),(1,3)。

【数据规模与约定】

本题采用子任务捆绑测试。

  • Subtask 1(10 pts):1≤n≤3001 ≤ n ≤ 3001≤n≤300。
  • Subtask 2(15 pts):1≤n≤2×1031 ≤ n ≤ 2\times10^31≤n≤2×103。
  • Subtask 3(15 pts):∀i∈{1,2,3,…,n},1≤ai≤2\forall i\in\{1,2,3,\dots,n\},1 ≤ a_i ≤ 2∀i∈{1,2,3,…,n},1≤ai​≤2。
  • Subtask 4(70 pts):没有额外限制。

对于 100%100\%100% 的数据,1≤l≤r≤n≤2×105,1≤ai≤1091 \le l\le r ≤ n ≤ 2\times10^5,1 ≤ a_i ≤ 10^91≤l≤r≤n≤2×105,1≤ai​≤109。

【提示与说明】

本题分值按 COCI 原题设置,满分 110110110。

题目译自 COCI2021-2022 CONTEST #4 T3 Izbori。

题解

25pts

O(n3)O(n^3)O(n3)的暴力
直接暴力累加计算就好了。
但其实累加的时候会有一个想法:sumj−(j>>1)>sumi−1−((i−1)>>1)sum_{j}-(j>>1)>sum_{i-1}-((i-1)>>1) sumj​−(j>>1)>sumi−1​−((i−1)>>1)即2×sumj−j>2×sumi−1−i−1即2\times sum_{j}-j>2\times sum_{i-1}-i-1即2×sumj​−j>2×sumi−1​−i−1
这就推出了我们的正解的想法。

110pts

我们再用一个数组ccc来保存2×sumi−i2\times sum_i-i2×sumi​−i的值。
ci=2×sumi−ic_i=2\times sum_i-ici​=2×sumi​−i
因为事实上我们只需要ccc的相对大小,并且每一段的ccc都是一段公差为111的等差数列,所以可以用类似于桶的想法,用一个数组ddd来保存不同值的ccc的个数。
di=Σj=1icjd_i=\Sigma_{j=1}^ic_jdi​=Σj=1i​cj​
于是我们就又会发现,对于一段ccc,产生的贡献又是对应这一段的Σdi\Sigma d_iΣdi​,所以可以再用数组eee保存数组ddd的前缀和。
ei=Σj=1idje_i=\Sigma_ {j=1}^id_jei​=Σj=1i​dj​
同时我们需要进行区间修改并求前缀和,所以我们又可以将其改为单点修改并求前缀和,此时,我们还需要一个数组fff。

总结一下上面的数组:(分不同种类的数)
sumj=Σi=1jaisum_j=\Sigma_{i=1}^ja_isumj​=Σi=1j​ai​
cj=2×sumj−jc_j=2\times sum_j-jcj​=2×sumj​−j
dk=Σj=1n(cj==k)(需要被区间修改)d_k=\Sigma_{j=1}^n(c_j==k)(需要被区间修改)dk​=Σj=1n​(cj​==k)(需要被区间修改)
ei=Σk=1idke_i=\Sigma_{k=1}^id_kei​=Σk=1i​dk​
fl=Σl=1ielf_l=\Sigma_{l=1}^ie_lfl​=Σl=1i​el​
所以维护三个树状数组就行。

代码实现

25pts

//洛谷 P8313 [COCI2021-2022#4] Izbori
#pragma GCC optimize(3)
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n;
int a[200010];
int b[200010];
int sum[200010];
int cnt;
int x;
long long ans;int find(int x){//二分查找int l=0,r=cnt,mid;while(l<r){mid=(l+r+1)>>1;if(b[mid]<=x){l=mid;}else{r=mid-1;}}return l;
}void in(int &x){int nt;x=0;while(!isdigit(nt=getchar()));x=nt^'0';while(isdigit(nt=getchar())){x=(x<<3)+(x<<1)+(nt^'0');}
}int main(){register int i,j;in(n);for(i=1;i<=n;++i){in(a[i]);b[i]=a[i];}sort(b+1,b+n+1);cnt=unique(b+1,b+n+1)-(b+1);//离散化for(i=1;i<=n;++i){x=find(a[i]);++sum[x];++ans;for(j=i+1;j<=n;++j){x=++sum[find(a[j])]>sum[x]?find(a[j]):x;if(sum[x]>=((j-i+1)>>1)+1){++ans;}}memset(sum,0,sizeof(sum));}printf("%lld\n",ans);return 0;
}

110pts

//洛谷 P8313 [COCI2021-2022#4] Izbori
#pragma GCC optimize(3)
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
int n;
int a[200010];
int b[200010];//用于离散化
long long d[400010];
long long e[400010];
long long f[400010];
int cnt;
int x,y;
long long ans;
vector<int>t[200010];int lowbit(int x){return x&-x;
}int find(int x){int l=0,r=cnt,mid;while(l<r){mid=(l+r+1)>>1;if(b[mid]<=x){l=mid;}else{r=mid-1;}}return l;
}void in(int &x){int nt;x=0;while(!isdigit(nt=getchar()));x=nt^'0';while(isdigit(nt=getchar())){x=(x<<3)+(x<<1)+(nt^'0');}
}void add(int i,long long c){int x=i;while(i<=2*n+2){d[i]+=c;e[i]+=c*x;f[i]+=c*x*x;i+=lowbit(i);}
}long long query(int i){long long ans=0;int x=i;while(i){ans+=d[i]*(x+2)*(x+1)-e[i]*(2*x+3)+f[i];i-=lowbit(i);}return ans/2;
}int main(){register int i,j,l;in(n);for(i=1;i<=n;++i){in(a[i]);b[i]=a[i];}sort(b+1,b+n+1);cnt=unique(b+1,b+n+1)-(b+1);for(i=1;i<=n;++i){t[find(a[i])].push_back(i);}for(i=1;i<=cnt;++i){t[i].push_back(n+1);l=0;for(j=0;j<t[i].size();++j){y=2*j-l+n+1;x=2*j-t[i][j]+n+2;ans+=query(y-1)-(x>=3?query(x-2):0);add(x,1);add(y+1,-1);l=t[i][j];}l=0;for(int j=0;j<t[i].size();++j){y=2*j-l+n+1;x=2*j-t[i][j]+n+2;add(x,-1);add(y+1,1);l=t[i][j];}}printf("%lld\n",ans);return 0;
}

洛谷 P8313 [COCI2021-2022#4] Izbori相关推荐

  1. 洛谷 深基 第1部分 语言入门 第4章 循环结构程序设计(2022.02.14)

    P5718 [深基4.例2]找最小值 [深基4.例2]找最小值 - 洛谷 P5718 [深基4.例2]找最小值(python3实现)-2022.02.01 P5718 [深基4.例2]找最小值(pyt ...

  2. 洛谷 刷题 深基部分题解(python版)-2022.01.29

    P5703 [深基2.例5]苹果采购(python3实现) https://blog.csdn.net/dllglvzhenfeng/article/details/122690555 P5703 [ ...

  3. 洛谷 U134038 兔子繁殖问题 代码 2022 01 27(C++)

    斐波那契数列 的简单版 题目来源: U134038 兔子繁殖问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/U1 ...

  4. 洛谷2020、2021、2022 CSP-J1 CSP-S1 第1轮 初赛模拟

    1033 - CSP 2020 第一轮(初赛)模拟 试题 - CSP 2020 第一轮(初赛)模拟 - 洛谷有题 [LGR-(-11)]CSP 2020 第一轮(初赛)模拟 - 比赛详情 - 洛谷 U ...

  5. 【洛谷】P8787 [蓝桥杯 2022 省 B] 砍竹子 的题解

    [洛谷]P8787 [蓝桥杯 2022 省 B] 砍竹子 的题解 题目传送门 思路 这个题有两个做法,一种是用 set 或者堆来维护一个高度到区间的映射,另一个用并查集维护区间. 这个题本质是一个最长 ...

  6. upc 2022/2/27 校赛+洛谷6599

    The problem is to construct a sequence that satisfy the following conditions: the length of the sequ ...

  7. 洛谷 深基 第4部分 基础数学与数论(19-21课)

    洛谷 深基 第4部分 基础数学与数论  第19章 位运算与进制转换 P1143 进制转换 https://www.luogu.com.cn/problem/P1143 洛谷P1143 进制转换的Pyt ...

  8. 洛谷 深基 第1部分 语言入门 第2章 顺序结构程序设计

    P5703 [深基2.例5]苹果采购 [深基2.例5]苹果采购 - 洛谷 P5703 [深基2.例5]苹果采购(python3实现) P5703 [深基2.例5]苹果采购(python3实现)_青少年 ...

  9. 洛谷、牛客网、AcWing 刷题(python版)

    牛客网python专项练习整理(一) https://blog.csdn.net/weixin_41913008/article/details/87203468 牛客网剑指offer--python ...

最新文章

  1. Git-remote Incorrect username or password ( access token )
  2. [Python人工智能] 二十三.基于机器学习和TFIDF的情感分类(含详细的NLP数据清洗)
  3. HDU - 4417 Super Mario(主席树/线段树+离线)
  4. Source code for Bayesian based CS and blind debluring
  5. 数据分析如何从1进阶到10?
  6. 好用的一些 git 命令
  7. wangEditor3菜单修改之如何添加分割线
  8. 远程 导数据 mysql_mysql远程导入
  9. Apache探索:Windows下搭建PHP运行环境(详细图文教程)
  10. 介绍一些免费好用的静态网站托管服务
  11. J.U.C之AQS:CLH同步队列
  12. CentOS6.5的安装及本地源的配置
  13. cad解除块的快捷命令_CAD解除编组及快捷键命令
  14. 趣味程序设计_出售金鱼
  15. 8_gin日拱一足---异步和同步
  16. Matlab中table类型使用技巧
  17. 雨林木风诚聘Linux研发工程师
  18. STM32F407-用TB6600驱动器驱动57步进电机(代码+连线)
  19. 设计简约风格节约用水公益海报的PS教程
  20. 浅析 Google 的云计算平台

热门文章

  1. 机器学习的算法有啥都不知道?8 个真实项目带你入门
  2. python 除法向下取整、向上取整
  3. spring boot集成ehcache 2.x 用于hibernate二级缓存
  4. 点击/拖拽两种方式,预览并上传png/jpg/jpeg格式图片
  5. NTLM/smb 中继攻击
  6. SELECTED联手微软小冰,推出人工智能系列服装
  7. EasyAR识别回调使用(jni回调)跟gradle配置
  8. 树莓派监控系统服务器,在树莓派3上搭建监控系统
  9. 由“徐玉玉”事件引发的数据治理体系化思考
  10. 计算机专业情书程序图,计算机专业学生的情书!