首页 > 其他分享 >CF1677E Tokitsukaze and Beautiful Subsegments

CF1677E Tokitsukaze and Beautiful Subsegments

时间:2024-02-03 22:11:07浏览次数:19  
标签:Beautiful nxt pre int max top Subsegments Tokitsukaze 矩形

(题目传送门)

你就算再怎么套路我也做不出来……

看到 \(\max a_k\),根据套路想到用单调栈处理出 \(a_i\) 左边第一个比它大的位置 \(pre_i\),右边第一个比它大的位置 \(nxt_i\)。枚举最大值 \(a_i\) 考虑它的贡献,显然若存在 \(j,k\) 满足 \(nxt_i<j,k<pre_i\) 且 \(a_j\times a_k=a_i\),那么记 \(x=\min(i,j,k),y=\max(i,j,k)\),那么 \((j,k)\) 就可以对区间 \((pre_i,x]\cup[y,nxt_i)\) 产生贡献。显然满足这种条件的数对不超过 \(\mathcal{O}(n\ln n)\) 个,可以预处理出来。

将这个区间贡献看成矩形的赋值,这是难操作的,尝试转化成矩形加。发现不同的 \(\max\) 值 \(a_i\) 的矩形不会相交,于是只需考虑单个 \(a_i\) 内部的矩形。假设现在有若干数对 \((x,y)\) 可以对 \((pre_i,x]\cup[y,nxt_i)\) 产生贡献,矩形可能相交。你发现如果 \(x_i<x_j\) 且 \(y_i>y_j\) 那么 \((x_i,y_i)\) 就被 \((x_j,y_j)\) 完全包含了,所以最后有用的数对必然满足 \(x_1<x_2<\dots <x_m\) 且 \(y_1<y_2<\dots <y_m\),这可以排序后单调栈求出。

将单个 \(a_i\) 的矩形拆解后,画个图发现这样的矩形覆盖可以直接容斥变成矩形加。于是问题转化成了矩形加、矩形求和。将询问离线下来,扫描线+树状数组维护即可。

#include<bits/stdc++.h>
#define LL long long
#define pii pair<int,int>
using namespace std;

const int N=2e5+10,M=1e6+10;

int n,m,p[N],q[N];
int sta[N],top,pre[N],nxt[N];
vector <pii> P[N],tmp,Q[N];
vector < array<int,3> > mat[N];
LL ans[M];

struct BIT
{
	LL c1[N],c2[N];

	void add(int x,int y)
	{
		for(int i=x; i<=n; i+=(i&-i))
		{
			c1[i]+=(LL)y;
			c2[i]+=1LL*y*x;
		}
	}

	LL ask(int x)
	{
		LL res=0;
		for(int i=x; i; i-=(i&-i))
			res+=1LL*(x+1)*c1[i]-c2[i];
		return res;
	}

	void update(int l,int r,int v){add(l,v);add(r+1,-v);}

	LL query(int l,int r){return ask(r)-ask(l-1);}
}T1,T2;

int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1; i<=n; i++)
		scanf("%d",&p[i]),q[p[i]]=i;

	for(int i=1; i<=n; i++)
	{
		while(top && p[sta[top]]<p[i])
			top--;
		pre[i]=sta[top];  sta[++top]=i;
	}
	sta[top=0]=n+1;
	for(int i=n; i>=1; i--)
	{
		while(top && p[sta[top]]<p[i])
			top--;
		nxt[i]=sta[top];  sta[++top]=i;
	}

	for(int i=1; i*(i+1)<=n; i++)
		for(int j=i+1; i*j<=n; j++)
			if(pre[q[i*j]]<min(q[i],q[j]) && nxt[q[i*j]]>max(q[i],q[j]))
				P[q[i*j]].push_back({min({q[i],q[j],q[i*j]}),max({q[i],q[j],q[i*j]})});

	for(int i=1; i<=n; i++)
	{
		tmp.clear();
		tmp.push_back({pre[i],i-1});
		sort(P[i].begin(),P[i].end(),[](pii A,pii B)
			{return A.first==B.first? A.second>B.second:A.first<B.first;});
		for(auto [l,r]:P[i])
		{
			while(r<=tmp.back().second)
				tmp.pop_back();
			tmp.push_back({l,r});
		}
		for(int j=1; j<tmp.size(); j++)
		{
			mat[tmp[j].second].push_back({tmp[j-1].first+1,tmp[j].first,1});
			mat[nxt[i]].push_back({tmp[j-1].first+1,tmp[j].first,-1});
		}
	}		

	for(int i=1; i<=m; i++)
	{
		int l,r;
		scanf("%d%d",&l,&r);
		Q[r].push_back({l,i});
	}

	for(int i=1; i<=n; i++)
	{
		for(auto [l,r,op]:mat[i])
		{
			T1.update(l,r,op);
			T2.update(l,r,op*(i-1));
		}
		for(auto [l,id]:Q[i])
			ans[id]=1LL*i*T1.query(l,i)-T2.query(l,i);
	}

	for(int i=1; i<=m; i++)
		printf("%lld\n",ans[i]);

	return 0;
}

标签:Beautiful,nxt,pre,int,max,top,Subsegments,Tokitsukaze,矩形
From: https://www.cnblogs.com/xishanmeigao/p/18005298

相关文章

  • BeautifulSoup爬虫库应用——Python 页面解析
    爬虫技术作为信息搜集的重要手段,在大数据时代发挥着至关重要的作用。通过网络爬虫,可以高效地从各种在线源头获取大规模、多样化的数据,为大数据分析和应用提供了必要的原始材料。首先,爬虫使得大数据的采集更为全面和及时。网络上存在着庞大的信息资源,包括社交媒体、新闻网站、电子......
  • BeautifulSoup和Cheerio库:解析QQ音频文件的完整教程
    在当今数字化的世界中,网络上充斥着各种各样的数据,而这些数据往往以各种不同的格式和结构存在。要从这些数据中获取有用的信息,我们就需要使用一些工具来解析和提取数据。BeautifulSoup和CheerioBeautifulSoup是Python中用于解析HTML和XML文档的库,而Cheerio是Node.js中类似的库。......
  • 深入解析网页结构解析模块BeautifulSoup
    引言在当今的信息化时代,网络爬虫已经成为获取数据的重要手段。而BeautifulSoup作为Python中常用的网页结构解析模块,在数据抓取过程中扮演着不可或缺的角色。本文将对BeautifulSoup进行深入解析,探讨其工作原理、使用方法和最佳实践,以期为读者提供有价值的参考。一、BeautifulSoup概......
  • Beautiful Bracket Sequence (easy version)
    传送门。题意一个含未知字符的括号序列,一个括号序列的权值是这个括号序列的最大深度。问所有可能的括号序列的权值和为多少。分析我们寻找一下深度的快速计算方式。可以发现两个巧妙的性质。以某一个位置分割,左边的左括号数量和右边的右括号数量的较小值就是这个位置的最大......
  • CF997E Good Subsegments
    对于这一类析合树问题有简单的线段树扫描线做法:考虑一个长为\(len\)的区间内一定有\(len-1\)个数值相邻的对,于是每次新加一个数\(a_i\)可以考虑相邻的两个数的出现位置\(p\),若\(p\lei\)就对\([1,p]\)区间加,表示左端点在\([1,p]\)的区间内多出一个相邻对接下来的问......
  • AtCoder Regular Contest 168 E Subsegments with Large Sums
    洛谷传送门AtCoder传送门尝试二分答案,问题变为要求恰好选\(x\)段\(\ges\),最大化选的段数。发现我们不是很会算段数的\(\max\),因为要求段不重不漏地覆盖\([1,n]\)。考虑给每个\(\ges\)段\([l,r]\)一个\(r-l\)的代价,于是变成了算代价的\(\min\)。此时不再要求......
  • ARC169 B Subsegments with Small Sums 题解
    LinkARC169BSubsegmentswithSmallSumsQuestion\(x\)是一个序列,定义\(f(x)\)为把序列\(x\)切成几段,每段的和不能超过\(S\)的最小段数给出序列\(A=(A_1,A_2,\cdots,A_N)\)求:\[\sum_{1\lel\leN}f((A_l,A_{l+1},\cdots,A_r))\]Question先考虑一个结论,\(x\)为......
  • 【EMNLP 2023】面向Stable Diffusion的自动Prompt工程算法BeautifulPrompt
    近日,阿里云人工智能平台PAI与华南理工大学朱金辉教授团队合作在自然语言处理顶级会议EMNLP2023上发表了BeautifulPrompt的深度生成模型,可以从简单的图片描述中生成高质量的提示词,从而使文生图模型能够生成更美观的图像。BeautifulPrompt通过对低质量和高质量的提示进行微调,并进一步......
  • CF55D Beautiful numbers
    题意给定序列\(S\)。求满足以下性质的\(S\)的排列的数量:\(\max_{j=1}^{i-1}s_j\ge2\timess_i\)或\(\max_{j=1}^{i-1}2\timess_j\les_i\)。Sol排个序先。设\(f_i\)表示我们从小到大往\(s\)里面填数,现在填的最大值为\(s_i\)的方案数。不难......
  • Count Beautiful Substrings II
    CountBeautifulSubstringsIIYouaregivenastring s andapositiveinteger k.Let vowels and consonants bethenumberofvowelsandconsonantsinastring.Astringis beautiful if:vowels==consonants.(vowels*consonants)%k==0,inothert......