首页 > 其他分享 > CF1819C The Fox and the Complete Tree Traversal

CF1819C The Fox and the Complete Tree Traversal

时间:2023-05-24 22:45:59浏览次数:46  
标签:Complete int Tree Fox mid Traversal 权值 序列 排序

\(\color{purple}\text{The Fox and the Complete Tree Traversal}\)

比较有意思的一题。先考虑一个序列的权值。对长度为 \(len\) 的序列排序,价值为 \(len-1\) ,那么有时候如果后面的元素很大,前面的很小:

3 2 1 300 200 100

我们可以将序列切为 \([1,3]\) ,和 \([4,6]\) 两部分分别排序,相比整个排序,权值减小了一。同时我们发现,序列中的排序区间必然不可能相交,因为相邻都只减少一,相交不如直接整个区间排。

触类旁通,如果我们将序列切成 \(n\) 个区间,满足每个区间中的数都大于所有区间前面的数,那么答案就为 \((len-1)-(n-1)\) 。

我们回到这题,求的是子串序列的权值和。那么易得每出现一组三元组满足 \((l,m,r)\) 满足 \(l\le m< r\) ,且 \(\min[m+1,r]>\max[l,m]\) ,那么就说明在子串 \([l,r]\) 可以在 \(m\) 这个地方切一刀,总答案减一。(总答案的初始值很好求的对吧)。

我的第一想法是枚举 \(l,m\) , \(r\) 的可选区间显然连续,那么用二分和 \(ST\) 表求出 \(r\) 的最后可选点。复杂度 \(O(n^2)\)

但这显然通过不了。更优的做法是枚举 \(a[i]\) 作为 \(\max[l,m]\) 时,\(l,m\) 就被定下来了,因为\(m\) 前面的数都得小于 \(a[i]\) 而 \(m\) 后面的数都大于 \(a[i]\) ,所以显然 \(m\) 就是 \(a[i]\) 后面第一个大于等于 \(a[i]\) 的数(单调栈),而 \(l\) 更不用说, \([l,i]\) 中的数得小于 \(a[i]\) ,求出 \(l\) 的可选区间,然后 \(r\) 同第一想法一样求出可选区间,复杂度就是 \(O(n)\) 了。

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+110;
int read(){
	int x=0,f=1;char c=getchar();
	while(c>'9' || c<'0'){if(c=='-')f=-1;c=getchar();}
	while(c>='0' && c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
	return x*f;
}
int L[N],R[N],T,n,a[N],st[N][18],lg[N];//2^20>1e6
int query(int l,int r){
	return min(st[l][lg[r-l+1]],st[r-(1<<lg[r-l+1])+1][lg[r-l+1]]);
}
stack<int>s;
void solve(){
	n=read();for(int i=1;i<=n;i++)a[i]=read(),st[i][0]=a[i];
	while(!s.empty())s.pop(); 
	for(int i=1;i<=n;i++){
		while(!s.empty() && a[s.top()]<a[i])s.pop();
		if(s.empty())L[i]=0;
		else L[i]=s.top(); 
		s.push(i);
	}
	while(!s.empty())s.pop();
	for(int i=n;i>=1;i--){
		while(!s.empty() && a[s.top()]<a[i])s.pop();
		if(s.empty())R[i]=n+1;
		else R[i]=s.top(); 
		s.push(i);
	}
	lg[1]=0;for(int i=2;i<=n;i++)lg[i]=lg[i>>1]+1;
	for(int i=1;i<=17;i++)
		for(int j=1;j<=n;j++)
			st[j][i]=min(st[j][i-1],st[j+(1<<i-1)][i-1]);
			
	int sum=0;
	for(int l2=1;l2<=n;l2++){
		int l1=L[l2]+1;
		int r1=R[l2];if(r1>n)continue;
		int l=r1,r=n,r2=-1;
		while(l<=r){
			int mid=(l+r)>>1;
			if(query(r1,mid)>=a[l2]){
				r2=mid;
				l=mid+1;
			}
			else r=mid-1;
		}
		sum+=(l2-l1+1)*(r2-r1+1);
	}
	int assist=0;
	for(int i=1;i<n;i++)assist+=i*(n-i);
	printf("%lld\n",assist-sum);
	return ;
}
signed main(){
	T=read();while(T--)solve();
	return 0;
}

标签:Complete,int,Tree,Fox,mid,Traversal,权值,序列,排序
From: https://www.cnblogs.com/FJOI/p/17429759.html

相关文章

  • sourceTree环境配置
    安装并配置完成git1、在gitbrashhere中允许命令ssh-keygen-ted25519-C"[email protected]" 按照提示完成三次回车,在用户目录下默认生成文件夹.ssh,打开可以找到id_rsa.pub文件,获取到你的publickeycat~/.ssh/id_ed25519.pub复制生成的SSH,通过仓库主页「管理」->「部署......
  • 最新版本firefox浏览器 显示echarts图表会卡死,但是Chrome浏览器或者Edge浏览器是正常
    如果您的Firefox浏览器最新版本也出现了无法正常显示Echarts图表的问题,可以尝试以下几个方法:1.禁用硬件加速:在一些特定的系统或者硬件环境下,启用Firefox的硬件加速功能可能会导致Echarts图表卡死。您可以尝试通过以下步骤禁用硬件加速:-在Firefox的地址栏中输入abou......
  • 1110 Complete Binary Tree(附测试点2,3,4,6分析)
    题目:Givenatree,youaresupposedtotellifitisacompletebinarytree.InputSpecification:Eachinputfilecontainsonetestcase.Foreachcase,thefirstlinegivesapositiveinteger N (≤20)whichisthetotalnumberofnodesinthetree--andh......
  • el-tree 自动展开
    el-tree自动展开需求:通过输入来筛选树中的数据,由于数据是通过懒加载得到的。因此需要手动的点击每个节点来展开它们。然而,如何才能不通过手动点击来展开所有节点呢?利用默认展开节点属性:default-expanded-keys="expandList"把当前分类节点数据加入默认展开的列表中。然后遍......
  • Paper Reading: forgeNet a graph deep neural network model using tree-based ensem
    目录研究动机文章贡献本文方法图嵌入深度前馈网络forgeNet特征重要性评估具体实现模拟实验合成数据生成实验评估实验结果真实数据应用BRCA数据集microRNA数据Healthyhumanmetabolomics数据集优点和创新点PaperReading是从个人角度进行的一些总结分享,受到个人关注点的侧重......
  • 1099 Build A Binary Search Tree
    题目:ABinarySearchTree(BST)isrecursivelydefinedasabinarytreewhichhasthefollowingproperties:Theleftsubtreeofanodecontainsonlynodeswithkeyslessthanthenode'skey.Therightsubtreeofanodecontainsonlynodeswithkeysg......
  • 网页的快捷方式打开自动全屏--Chrome、Firefox 浏览器相关设置
    Firefox的全屏方式与Chrome不同,Chrome自带全屏模式以及APP模式,通过简单的参数即可设置,而Firefox暂时么有这个功能,Firefox的全屏功能可以通过全屏插件实现。全屏模式下,按F11不会退出全屏,鼠标移动到屏幕上方也不会提示退出全屏如果当前运行着其它的Chrome窗口,那么全屏化......
  • java学习日记20230522-TreeSet
    有序键值对集合publicclassTreeSetExercise{publicstaticvoidmain(String[]args){Integerinteger=newInteger(10);TreeSettreeSet=newTreeSet(newComparator(){@Overridepublicintcompare(Objecto1,Obj......
  • SVN commit:remains in tree-conflict错误的解决办法
    昨天在提交一个新类包的时候,出错了,重新提交了几次也不行.Abortingcommit:‘C:/workspace/MyWork/src/org’remainsinconflict由于是新第一次提交,感觉上应该是没有问题的.最后上网找了一下,发现了解决办法.Eclipse中的解决办法右击工程目录–>team–>ShowTreeConflict......
  • 如何在gdb中打印<incomplete type>变量 gdb
    linkvimain1.cpp#include<iostream>#include<fstream>#include<stdio.h>usingnamespacestd;intmain(){ifstreaminFile("test.txt",ios::in);//printf("%p",inFile);cout<<"inFile="&l......