首页 > 其他分享 >P3521 [POI2011] ROT-Tree Rotations

P3521 [POI2011] ROT-Tree Rotations

时间:2023-08-26 10:55:41浏览次数:44  
标签:val rs int POI2011 Tree mid ls now ROT

P3521 [POI2011] ROT-Tree Rotations

首先合并两棵子树的时候只关心子树内值的个数,并不关心子树内具体是什么顺序,引导从下向上线段树合并计算代价。

每一个值只会出现一次,首先每个叶子节点开一棵动态开点值域为 \(1-n\) 的线段树维护,初始只有自己的值的位置为 \(1\)。

然后对于每个非叶子节点,从下至上合并,两棵子树有两种方案,计算时使用 \(sum1\) 和 \(sum2\) 维护两种合并方式的代价,计算即为 \(A\) 子树中 \(l\) 到 \(mid\) 值的个数和 \(mid+1\) 到 \(r\) 值的个数的乘积,另一种情况相反。

    int n,cnt,ans,sum1,sum2;
	struct{int ls,rs,val;}t[4800001];
	inline void update(int p){t[p].val=t[t[p].ls].val+t[t[p].rs].val;}
	inline void add(int &now,int l,int r,int x)
	{
		if(!now)now=++cnt;
		if(l==r)return ++t[now].val,void();
		int mid=l+((r-l)>>1);
		if(x<=mid)add(t[now].ls,l,mid,x);
		else add(t[now].rs,mid+1,r,x);
		update(now);
	}
	inline void merge(int &x,int &y,int l,int r)
	{
		if(!x||!y)return x|=y,void();
		int mid=l+((r-l)>>1);
		t[x].val+=t[y].val,sum1+=t[t[x].ls].val*t[t[y].rs].val,sum2+=t[t[x].rs].val*t[t[y].ls].val;
		merge(t[x].ls,t[y].ls,l,mid),merge(t[x].rs,t[y].rs,mid+1,r);
	}
	void print(int k,int l,int r)
	{
		if(!k)return;
		int mid=l+((r-l)>>1);
		cout<<l<<" "<<r<<" "<<t[k].val<<endl,print(t[k].ls,l,mid),print(t[k].rs,mid+1,r);
	}
	int dfs()
	{
		int now=0,k;read(k);
		if(k)return add(now,1,n,k),now;
		int lef=dfs(),rig=dfs();
		return sum1=sum2=0,merge(lef,rig,1,n),ans+=min(sum1,sum2),lef;
	}
	inline void mian(){read(n),dfs(),write(ans);}

标签:val,rs,int,POI2011,Tree,mid,ls,now,ROT
From: https://www.cnblogs.com/WrongAnswer90-home/p/17658476.html

相关文章

  • git_使用git worktree命令使不同分支的代码文件可以同步运行
    情景再现:我本地代码正在开发后台系统的过程中,前台开发的同事时不时地会来找我要IP地址,使用正在开发的后台管理系统来进行一些数据的增删改查.这个时候直接提供正在开发的版本的开发服务器地址是不行的,因为随着代码的编写时不时的报个bug是家常便饭,对于使用者来说非常......
  • el-tree 折叠节点时去掉 defaultExpandedKeys 中已折叠的节点及其子节点
    问题场景树形节点默认是全部折叠的。展开节点A,再把它折叠。然后给节点B新增子节点,新增成功后刷新树,却发现节点A是展开的。原因分析树刷新后全部节点都默认是折叠的,除非defaultExpandedKeys数组中有数据(这些节点数据是展开的)。因此,只需要在折叠节点A时,在defaultExpandedKeys......
  • Python logging.handlers模块,RotatingFileHandler、TimedRotatingFileHandler 处理器
    转自:https://blog.csdn.net/B11050729/article/details/132353220 ......
  • 遍历Tree控件中的节点
    classSapGuiTree:classTreeType(enum.Enum):SIMPLE=0LIST=1COLUMN=2@classmethoddefshow(cls,tree,node,indention):print(indention,node,[tree.GetItemText(node,col......
  • 「题解」Codeforces 825G Tree Queries
    点权转边权,把边权设为两个端点的\(\min\),然后发现询问\(x\)的答案,就是询问\(x\)与所有黑点的虚树,边权的\(\min\)是多少。假设要判定答案是否\(\geqk\),那么就是询问\(x\)只经过\(\geqk\)是否能到达所有黑点,于是想到建立Kruskal重构树,那么\(x\)与所有黑点的LCA......
  • 【Protoc】VS2019 (VS平台) 使用 CMake 编译安装、使用 Protobuf 库
    背景:工作中需要使用到protobuf,看了一些教程,感觉都不是很适合,便自己总结一些开发环境:Win10VS2019CMake3.24.2Protobuf3.21.12(Protoc版本必须于Protobuf版本一致)MinGW版本的编译在之后有空再研究。https://stackoverflow.com/questions/9243816/how-to-build-......
  • PQ-Tree
    为什么NOIP模拟会考到这种东西啊?PQ-Tree能解决也恐怕仅能解决如下问题:对于长度为\(n\)的排列\(p\),在线地给出\(q\)个限制,每次给定一个集合\(S\),要求在\(p\)中,\(S\)中的所有数出现位置构成一个连续段,要求对排列计数。朴素实现的PQ-Tree可以给出一个\(O(nq)\)的......
  • JAVA使用Protobuf GRPC
    IDEA安装Protobuf插件引入maven依赖<dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>3.19.1</version></dependency>protobuf是目前比较新的版本,之前测试过程中使用3.9.1。发现生成的源代码......
  • 13 JavaScript关于prototype(超重点)
    13JavaScript关于prototype(超重点)prototype是js里面给类增加功能扩展的一种模式.写个面向对象来看看.functionPeople(name,age){this.name=name;this.age=age;this.run=function(){console.log(this.name+"在跑")}}p1=newPeople("......
  • 【学习笔记】DSU on Tree
    概述DSUonTree即树上启发式合并,重点不在“合并”,而在利用树链剖分的性质对子树问题进行复杂度正确的分治。算法流程递归处理轻儿子的答案递归处理重儿子的答案重新遍历轻儿子子树,计算当前子树的答案如果当前节点是轻儿子,重新遍历整棵子树,清除答案发现一个节点......