首页 > 其他分享 >【CodeChef】Limit of MEX(二分、ST表、组合数学)

【CodeChef】Limit of MEX(二分、ST表、组合数学)

时间:2024-05-23 15:08:37浏览次数:19  
标签:... cdot max sum 个数 MEX Limit ST ll

题目大意:

计算\(\sum_{L=1}^{N}\sum_{R=L}^{N}f(A_L,...,A_R)\),其中\(f(A_1,A_2,...,A_N)=\max(A_1,A_2,...,A_N)-count(A_1,A_2,...,A_N)+1\),\(count\)函数的值为参数中不同元素的个数。


考虑计算\(\sum_{L=1}^{N}\sum_{R=L}^{N}max(A_1,A_2,...,A_N)\)。

对于任意\(1\le i\le n\),我们找出最小的\(l_i\)最大的\(r_i\),使得\(\max(A_{l_i},...,A_{i-1})\le A_i\)且\(\max(A_{i+1},...,A_{r_i})<A_i\)。这两个值可以用二分得到。验证二分的值需要用到\(A_1,...,A_N\)连续子区间最大值,这可以用ST表解决。

求出\(l_i\)和\(r_i\)后,我们可以得到\(A_i\)对答案的贡献为\(A_i\cdot(i-l_i+1)\cdot(r_i-i+1)\),所以答案为\(\sum_{i=1}^{N}A_i\cdot(i-l_i+1)\cdot(r_i-i+1)\)。


考虑计算\(\sum_{L=1}^{N}\sum_{R=L}^{N}count(A_1,A_2,...,A_N)\)。

对于任意\(x\in {A_1,A_2,...,A_N}\),我们考虑所有值为\(x\)的元素对答案的贡献,即\(A_1,..A_N\)中有多少个连续子区间包含等于\(x\)元素。

直接计算包含等于\(x\)元素的连续子区间个数较为困难。所以可以算出不包含等于\(x\)元素的连续子区间个数,然后将所有连续子区间个数减去这个值,即可得到包含等于\(x\)元素的连续子区间个数,即当前\(x\)对答案的贡献。

将所有的贡献相加即是答案。

#include<bits/stdc++.h>
#define pt printf(">>>")
#define mid (((l)+(r))/2)
using namespace std;
typedef long long ll;
const ll N=1e6+10,inf=1e18+10,mod=1e9+7;
ll n,a[N],st[N][30],lg[N];
ll query(ll l,ll r){return max(st[l][lg[r-l+1]],st[r-(1<<lg[r-l+1])+1][lg[r-l+1]]);}
ll f(ll x){
	ll ret1=x,ret2=x,l,r;
	l=1,r=x-1;
	while(l<=r)
		if(query(mid,x-1)<=a[x])ret1=mid,r=mid-1;
		else l=mid+1;
	l=x+1,r=n;
	while(l<=r)
		if(query(x+1,mid)<a[x])ret2=mid,l=mid+1;
		else r=mid-1;
	return (x-ret1+1)*(ret2-x+1);
}
ll work1(){
	ll ret=0;
	for(ll i=1;i<=n;i++)st[i][0]=a[i];
	for(ll i=2;i<=n;i++)lg[i]=lg[i>>1]+1;
	for(ll i=1;i<=lg[n];i++)
		for(ll j=1;j+(1<<i)-1<=n;j++)
			st[j][i]=max(st[j][i-1],st[j+(1<<(i-1))][i-1]);
	for(ll i=1;i<=n;i++)ret+=a[i]*f(i);
	return ret;
}
ll cal(ll x){return (x+1)*x/2;}
ll work2(){
	map<ll,vector<ll> > pos;
	ll ret=0;
	for(ll i=1;i<=n;i++)pos[a[i]].push_back(i);
	for(auto c:pos){
		ret+=cal(n);
		for(ll i=0;i<c.second.size();i++){
			ll now=c.second[i];
			if(i==0)ret-=cal(c.second[i]-1);
			else ret-=cal(c.second[i]-c.second[i-1]-1);
			if(i+1==c.second.size())ret-=cal(n-c.second[i]);
		}
	}
	return ret;
}
int main(){
	int T=1;
	cin >> T;
	while(T--){
		cin >> n;
		for(ll i=1;i<=n;i++)cin >> a[i];
		cout << work1()-work2()+(1+n)*n/2 << endl;
	}
	return 0;
}

标签:...,cdot,max,sum,个数,MEX,Limit,ST,ll
From: https://www.cnblogs.com/alric/p/18208402

相关文章

  • $ git push -u origin "master"
    $gitpush-uorigin"master"Tohttps://gitee.com/ee/0523.git ![rejected]       master->master(non-fast-forward)error:failedtopushsomerefsto'https://gitee.com/ee/0523.git'hint:Updateswererejectedbecauseapushedbra......
  • 满足 5G 通信的带宽需求,1ST040EH2F35I2LG,1ST085ES3F50I3VG,1ST085ES3F50E3VG,1ST110E
    说明Stratix®10FPGA和SoCFPGA大幅提高了性能、功效、密度和系统集成度。Stratix10采用创新HyperflexFPGA架构,将嵌入式多芯片互连桥接器(EMIB)、高级接口总线(AIB)和芯片组等技术结合在一起。™因此,与上一代高性能FPGA相比,Stratix10器件的性能提高了2倍。Stratix®10......
  • 【MinIO】SpringBoot引入MinIO依赖遇到的一些问题:okhttp、kotlib-stdlib
    参考官方文档SDK:https://docs.min.io/docs/java-client-quickstart-guide.htmlMinIOJavaSDKisSimpleStorageService(akaS3)clienttoperformbucketandobjectoperationstoanyAmazonS3compatibleobjectstorageservice.MinIO依赖jar包下载地址:CentralReposi......
  • IDocList/IDocDict JSON for Delphi and FPC
    IDocList/IDocDictJSONforDelphiandFPC【英文原文】多年来,我们的开源mORMot框架提供了多种方式,以处理在运行时定义的任何数组/对象文档组合,例如通过JSON,它具备许多功能,并且非常高的性能。我们的TDocVariant自定义变体类型是处理这类无模式数据的一种强大方式,但一些用户......
  • 搜索引擎ElasticSearch18_ElasticSearch集群4
    ES集群是一个P2P类型(使用gossip协议)的分布式系统,除了集群状态管理以外,其他所有的请求都可以发送到集群内任意一台节点上,这个节点可以自己找到需要转发给哪些节点,并且直接跟这些节点通信。所以,从网络架构及服务配置上来说,构建集群所需要的配置极其简单。在Elasticsearch2.......
  • 搜索引擎ElasticSearch18_IK 分词器和ElasticSearch集成使用3
    一、上述查询存在问题分析在进行字符串查询时,我们发现去搜索"搜索服务器"和"钢索"都可以搜索到数据;而在进行词条查询时,我们搜索"搜索"却没有搜索到数据;究其原因是ElasticSearch的标准分词器导致的,当我们创建索引时,字段使用的是标准分词器: {    "query": {  ......
  • 搜索引擎ElasticSearch18_ElasticSearch的客户端操作2
    实际开发中,主要有三种方式可以作为elasticsearch服务的客户端:第一种,elasticsearch-head插件第二种,使用elasticsearch提供的Restful接口直接访问第三种,使用elasticsearch提供的API进行访问一、安装Postman工具Postman中文版是postman这款强大网页调试工具的windows客户端,提......
  • 搜索引擎ElasticSearch18_ElasticSearch简介1
    一、ElasticSearch简介1、什么是ElasticSearchElaticsearch,简称为es,es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。es也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但......
  • 最短路-迪杰斯特拉(dijkstra)
    迪杰斯特拉(dijkstra)////CreatedbyLANSGANBSon2024/3/8.///**codetemplate:https://github.com/LANSGANBS/code-template*URL:*Status:*写完这道就去原*/#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;#defineendl'\n&......
  • windows上使用wsl的ubuntu部署stirling-pdf
    由于要部署stirling-pdf需要docker环境,所以需要使用ubuntu系统,那么在win10/win11上最方便的方式就是使用wsl安装ubuntu然后再wsl上的ubuntu上进行部署,接下来就是整个步骤在windows上使用wsl安装ubuntu,在powershell上使用wsl--install命令就可以默认安装ubuntu了,方便快捷登录ub......