首页 > 其他分享 >【题解 P4062 & P8313】 Yazid 的新生舞会&Izbori

【题解 P4062 & P8313】 Yazid 的新生舞会&Izbori

时间:2023-11-13 19:25:02浏览次数:40  
标签:Malnar P8313 int 题解 样例 mid Yazid ++ 众数

[COCI2021-2022#4] Izbori

题目描述

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

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

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

输入格式

第一行包含一个整数 \(n\),表示房屋的数量。

第二行包含 \(n\) 个整数 \(a_i\),表示第 \(i\) 栋房屋内居民最喜欢的菜。

输出格式

仅一行,输出可以使 Malnar 先生赢得竞选的 \((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)\) 为:\((1, 1),(2, 2),(3, 3),(1, 3)\)。

【数据规模与约定】

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

  • Subtask 1(10 pts):\(1 ≤ n ≤ 300\)。
  • Subtask 2(15 pts):\(1 ≤ n ≤ 2\times10^3\)。
  • Subtask 3(15 pts):\(\forall i\in\{1,2,3,\dots,n\},1 ≤ a_i ≤ 2\)。
  • Subtask 4(70 pts):没有额外限制。

对于 \(100\%\) 的数据,\(1 \le l\le r ≤ n ≤ 2\times10^5,1 ≤ a_i ≤ 10^9\)。

【提示与说明】

本题分值按 COCI 原题设置,满分 \(110\)。

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

解题思路

简明题意就是:找出满足一定条件的区间个数,每个区间需满足其中最大的数出现的次数严格大于区间长度的一半。
首先,我们可以考虑枚举每一个数,求出满足这个数在区间内出现次数大于区间长度一般的的区间个数,最后累加即可。
设 \(a_i\) 为 \(1~i\) 中当前枚举数的出现个数,很明显,需要满足 \(a_r-a_{l-1}>(r-(l-1))/2\) 。
即为 \(2*a_r-r>2*a_{l-1}-(l-1)\) 。
这就是一个偏序问题了,时间复杂度 \(O(n^2logn)\) 。
考虑优化这个问题。
观察题目中找的是绝对众数,我们可以发现,从一个左端点开始找绝对众数,那么能成为绝对众数的数最多 \(log_{r-l+1}\) 个。
很容易理解,因为若要更新绝对众数,他是成倍增长的。
那么,我们就可以 \(cdq\) 分治了。
考虑左区间与右区间合并的贡献。
我们可以找出能成为绝对众数的数,最多 \(log_{r-l+1}\) 个,我们可以处理出这些数,然后按上面的方法求解偏序,加上单个数的贡献即可。
时间复杂度 \(O(nlog^2n)\) 。

Code

#include<bits/stdc++.h>
using namespace std;
int n,a[500005],d[500005],t[500005],w;
long long s=0;
bool cmp(int q,int w)
{
	return q>w;
}
void gaia(int l,int r)
{
	if(l==r)return;
	int mid=(l+r)>>1;
	gaia(l,mid);
	gaia(mid+1,r);
	int x=0;
	w=0;
	for(int i=mid;i>=l;i--)
	{
		d[a[i]]++;
		if(d[a[i]]>(mid-i+1)/2)t[++w]=a[i];
	}
	for(int i=l;i<=mid;i++)d[a[i]]=0;
	for(int i=mid+1;i<=r;i++)
	{
		d[a[i]]++;
		if(d[a[i]]>(i-mid)/2)t[++w]=a[i];
	}
	for(int i=mid+1;i<=r;i++)d[a[i]]=0;
	sort(t+1,t+w+1);
	for(int i=1;i<=w;i++)
	{
		if(t[i]==t[i-1])continue;
		if(a[mid]==t[i])d[mid]=2+mid;
		else d[mid]=mid;
		for(int j=mid-1;j>=l;j--)
		{
			d[j]=d[j+1]-1;
			if(a[j]==t[i])d[j]+=2;
		}		
		sort(d+l,d+mid+1,cmp);
		if(a[mid+1]==t[i])d[mid+1]=mid;
		else d[mid+1]=mid+2;
		for(int j=mid+2;j<=r;j++)
		{
			d[j]=d[j-1]+1;
			if(a[j]==t[i])d[j]-=2;
		} 
		sort(d+mid+1,d+r+1,cmp);
		x=l-1;
		for(int j=mid+1;j<=r;j++)
		{
			while(x<mid&&d[x+1]>d[j])x++;
			s+=x-l+1;
		}
		for(int j=l;j<=r;j++)d[j]=0;
	}
	return;
}
int m;
set<int> l;
map<int,int> p;
int main()
{
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&a[i]);
		l.insert(a[i]);
	}
	int g=0;
	set<int>::iterator q=l.begin();
	for(;q!=l.end();q++)
	{
		p[*q]=++g;
	}
	for(int i=1;i<=n;i++)a[i]=p[a[i]];
	gaia(1,n);
	cout<<s+n;








  return 0;
}

标签:Malnar,P8313,int,题解,样例,mid,Yazid,++,众数
From: https://www.cnblogs.com/dijah/p/17829902.html

相关文章

  • 【题解】CF1891E - Brukhovich and Exams
    【题解】CF1891E-BrukhovichandExamshttps://www.luogu.com.cn/problem/CF1891E我们考虑把区间分段:若两个相邻的数不互素,中间分开;若两个相邻的数中有且仅有一个\(1\),中间分开。那么我们得到了两种区间:全\(1\)区间与无\(1\)区间。若两个相邻数在同一区间内,那么就在区间......
  • [题解] CFgym101623F Factor-Free Tree
    Factor-FreeTree当一棵二叉树中的每个节点的权值都与它所有祖先的权值互质时,我们称它为factor-freetree。给你一棵按照中序遍历的顺序的权值序列\(a\),求这个序列是否对应这一棵factor-freetree。如果是就输出每个节点的父亲。\(n\le10^5,a_i\le10^7\)。考虑怎么......
  • SP2139题解
    思路这题数据范围小,暴力就可以了。首先我们用map来统计每个人的下标,用\(bk_{i,j}\)表示第\(i\)个人第\(j\)题是否知道答案。对于每次合作交流,暴力修改就可以了,先统计出两个人的下标,假设一个为\(x\),另一个为\(y\)。然后,如果\(bk_{x,i}\)和\(bk_{y,i}\)中(\(1\lei......
  • [ARC106E] Medals 题解
    题意有一个商店和\(N\)名员工,其中第\(i\)名员工在第\(1\simA_i\)天工作,在第\(A_i+1\sim2\timesA_i\)休息,接下来每\(A_i\)天改变一次状态。每一天你都可以选择一名来上班的员工并为其颁一个奖,求使得每名员工都获得至少\(K\)个奖的最小天数。\(1\leN\le......
  • [题解] CF1156E Special Segments of Permutation
    SpecialSegmentsofPermutation给你一个排列\(p\),求有多少个区间\([l,r]\)满足\(p_l+p_r=\max_{i\in[l,r]}p_i\)。\(n\le2\times10^5\)。按最大值分治,记当前的分治中心为\(mid\),分治区间为\([l,r]\)。然后需要计算跨分治中心的贡献。如果\(mid-l......
  • [题解]AT_abc328_f [ABC328F] Good Set Query
    思路带权并查集模板。如果对于一个三元组\((a,b,c)\)如果它能够添加到\(S\)中一定满足如下条件中的一条:\(X_a,X_b\)满足其中有一个是「不确定」的。在这里\(X_i\)「不确定」指\(X_i\)没有与其它的任意\(X_j\)有关系。\(X_a,X_b\)有间接或直接的关系,但是能计算......
  • CF300B Coach 题解
    闲话调了好一会,甚至还重构了一次代码才对,但是还是很喜欢并查集,并查集可爱捏。题意省流$n$个学生分成$3$人一组,要满足$m$个条件,每个条件给出两个数$x,y$,要求$x$和$y$必须在一个组里。正文要使学生三人一组,一眼使用并查集。首先考虑无解(输出$-1$)的情况:给出的限......
  • 【题解 P8476】 惊蛰
    「GLR-R3」惊蛰题目背景  「微雨众卉新,一雷惊蛰始」  中午,休息室,阿绫肩膀上。  “我有一个愿望,参加全国音乐祭,获奖,和阿绫一起,摆脱这训练的苦海。”  “为热爱而到来,为抽身而努力……吗”。  正午的阳光渗过窗帘,抚上困倦的人儿的脸颊。天依的左手悄悄搭上阿绫怀里......
  • NOJ题解
    NOJ题解30-40素数埃氏筛,欧拉筛都可可变参数累加/平均用给出的库函数即可基思数根据题意模拟#include<stdio.h>#definelllonglongllnum[102];inlineboolIsKeith(lln){inttot=0,t=0;lls=n;while(s){num[++tot]=s%10......
  • 问题解答:SAP OData V2 和 V4 里针对日期类型的字段进行过滤操作(filter)的正确语法试
    我的知识星球里有朋友咨询一个问题:我测试了一个S/4HANAcloud的purchaseorder的API,这个是ODATAV4格式的。在对CreationDate做filter后运行有报错Invalidparametertypeusedwithfunction'eq'.对datetime字段做filter,一直搞不清楚格式。请帮忙看一下。本文就安排这......