P3521 [POI2011] ROT-Tree Rotations
时间:2023-08-26
本文章向大家介绍P3521 [POI2011] ROT-Tree Rotations,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
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);}
原文地址:https://www.cnblogs.com/WrongAnswer90-home/p/17658476.html
- spark零基础学习线路指导
- MySQL数据库(十):用户授权与撤销授权
- Oracle 12c系列(二)|PDB的创建
- Spring Security 入门(四):自定义-Filter
- Go语言中Select语句用法实例
- 从Mysql备份中恢复单个表
- spark编译:构建基于hadoop的spark安装包及遇到问题总结
- Mysql忘记root密码的恢复方法
- 深入剖析Go语言编程中switch语句的使用
- MySQL中DDL、DML、DCL的那些语句
- 如何查看spark与hadoop、kafka、Scala、flume、hive等兼容版本【适用于任何版本】
- golang实现简单的udp协议服务端与客户端示例
- Oracle 12c系列(三)|存储资源隔离 Flex Diskgroup
- Scala的map实现key和value排序及各种排序比较等知识讨论
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 一份礼物.apk - o泡果奶-的逆向分析
- 代码审计-.NET下的序列化与反序列化(BinaryFormatter)
- 02.视频播放器整体结构
- Spring中@Component和@Bean
- HTTP对接方式
- 使用ShardingSphere 过程中遇到的关于spring boot 版本的问题
- 腾讯云TKE-Pod案例: 容器内crontab问题
- iOS音视频接入 - TRTC多人视频会议
- Spring系列 SpringMVC的请求与数据响应
- codeforces 1349A(数学)
- leetcode之找不同
- 太强了,这居然是19年双非本科开发一年的Android面筋!开发几年的老程序员自叹不如
- Kotlin Vocabulary | Reified: 类型擦除后再生计划
- WorkManager 在 Kotlin 中的实践
- ElasticSearch 集群分片内部原理