bzoj1455: 罗马游戏 + bzoj2809: Dispatching(可并堆)
昨天看了可并堆是什么,写的是左偏树
大概就是一棵树
1、有左偏性质,即当前根到左叶子节点距离比到右叶子节点距离大
2、有堆性质,堆顶关键字比子树关键字小
合并两个堆的时候,关键字大的插入到关键字小的那堆的右子树中,右子树的深度大于左子树时交换两者以维持左偏性质。
堆中个数太多的时候,pop堆顶的元素x
具体是合并左右两个子树后返回新的堆顶元素y,清除完x的信息后root[x]指向y
bzoj1455:用并查集合并团,用可并堆维护团中最小的人。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
;
int n,m,v[maxn],vis[maxn],fa[maxn],l[maxn],r[maxn],a,b,d[maxn];
];
int find(int x){
return (fa[x]==x)?x:fa[x]=find(fa[x]);
}
int merge(int x, int y){
if (!x || !y) return x+y;
if (v[x]>v[y]) swap(x,y); //保证堆顶最小
r[x]=merge(r[x],y);
if (d[r[x]]>d[l[x]]) swap(l[x],r[x]);
d[x]=d[r[x]]+;
return x;
}
int main(){
scanf("%d", &n);
; i<=n; i++) scanf("%d", &v[i]);
scanf(]=-;
; i<=n; i++) fa[i]=i;
; i<=m; i++){
scanf("%s", s);
]=='M'){
scanf("%d%d", &a, &b);
if (vis[a] || vis[b]) continue;
int fx=find(a), fy=find(b);
if (fx!=fy) fa[fx]=fa[fy]=merge(fx,fy); // 合并从堆顶开始合并
}else{
scanf("%d", &a);
");
else{
;// printf(" %d\n", fx);
printf("%d\n", v[fx]);
fa[fx]=merge(l[fx],r[fx]);
fa[fa[fx]]=fa[fx];
}
}
}
;
}
bzoj2809:DFS一遍,从叶子节点开始向上递归,到一个节点,可并堆维护当前子树中满足预算的最多人数,然后用当前子树更新答案。具体是每个节点都插入,超出预算就pop最大花费的人直到满足预算
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define LL long long
using namespace std;
;
struct node{
int to,next;
}e[maxn];
struct heap{
int l,r;
LL val;
}t[maxn];
,head[maxn];
LL v[maxn],w[maxn],ans,sum[maxn],add[maxn];
void insert(int u, int v){
e[++tot].to=v; e[tot].next=head[u]; head[u]=tot;
}
int merge(int x, int y){
if (!x || !y) return x+y;
if (t[x].val<t[y].val) swap(x,y);
t[x].l=merge(t[x].l,y);
swap(t[x].l,t[x].r);
return x;
}
void Pop(int x){
int rt=root[x];
root[x]=merge(t[rt].l,t[rt].r);
sum[x]--; add[x]-=t[rt].val;
t[rt].l=t[rt].r=t[rt].val=;
}
void dfs(int u){
add[u]=sum[u]=;
for (int i=head[u],vv; i; i=e[i].next){
dfs(vv=e[i].to);
add[u]+=add[vv]; sum[u]+=sum[vv];
root[u]=merge(root[u],root[vv]);
while (add[u]>m) Pop(u);
}
add[u]+=v[u]; sum[u]++;
t[u]=(heap){,,v[u]};
root[u]=merge(root[u],u);
while (add[u]>m) Pop(u);
ans=max(ans,sum[u]*w[u]);
}
int main(){
scanf("%d%d", &n, &m); int s;
; i<=n; i++){
int x;
scanf("%d%lld%lld", &x, &v[i], &w[i]);
insert(x,i); if (!x) s=i;
}
dfs(s);
printf("%lld\n", ans);
;
}
bzoj1455: 罗马游戏 + bzoj2809: Dispatching(可并堆)的更多相关文章
- [bzoj1455]罗马游戏_左偏树_并查集
罗马游戏 bzoj-1455 题目大意:给你n个人,2种操作,m次操作:1.将i号士兵所在的集合的最小值删除 2.合并i和j两个士兵所在的团体 注释:$1\le n\le 10^6$,$1\le m ...
- [BZOJ1455]罗马游戏 左偏树+并查集
1455: 罗马游戏 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 2285 Solved: 994[Submit][Status][Discuss] ...
- BZOJ1455 罗马游戏 左偏树 可并堆
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1455 题意概括 n个人,2种操作. 一种是合并两个人团,一种是杀死某一个人团的最弱的人. 题解 左 ...
- Bzoj1455 罗马游戏
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1622 Solved: 679 Description 罗马皇帝很喜欢玩杀人游戏. 他的军队里面有n个人 ...
- 【数据结构】bzoj1455罗马游戏
Description 罗马皇帝很喜欢玩杀人游戏. 他的军队里面有n个人,每个人都是一个独立的团.最近举行了一次平面几何测试,每个人都得到了一个分数. 皇帝很喜欢平面几何,他对那些得分很低的人嗤之以鼻 ...
- BZOJ1455——罗马游戏
1.题目大意:维护一个数据结构,可以实现合并操作,还能询问最小值 2.分析:这种问题当然是可并堆啦 随便写了一个左偏树QAQ #include <cstdio> #include < ...
- [BZOJ1455]罗马游戏(左偏树)
用并查集和左偏树维护士兵的关系 Code #include <cstdio> #include <algorithm> #define N 1000010 using name ...
- BZOJ1455罗马游戏
左偏树裸题. 题面描述让人意识到了平面几何的重要性. //Achen #include<algorithm> #include<iostream> #include<cs ...
- 【BZOJ-1455】罗马游戏 可并堆 (左偏树)
1455: 罗马游戏 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1355 Solved: 561[Submit][Status][Discuss] ...
随机推荐
- express细节点注意
删除 cookie 需要这么 res.cookie('admin_uid',"null",{maxAge:0, httpOnly:true, path:'/',domain:'.o ...
- Expression Blend 4 学习笔记
Animation Storyboard(情节提要)在对象和时间线面板中建立和命名,定位到对象(object),通过拖动play head(播放头,时间线中垂直的黄色指示线)定位到特定的时间点,点击“ ...
- jQuery简单实现iframe的高度根据页面内容自适应的方法(转)
本文实例讲述了jQuery简单实现iframe的高度根据页面内容自适应的方法.分享给大家供大家参考,具体如下: 方式1: //注意:下面的代码是放在和iframe同一个页面中调用 $("#i ...
- ubuntu下更改鼠标移动速度
ubuntu下,系统设置中,无法更改外接鼠标的移动指针速度,如图: 然后百度,终于找到一个靠谱打方法: 命令: xset m N 其中,N是速度,估计取值为0-10 该方法比起网上的某些攻略简单好多
- yii asset 初步
yii 版本是2.0 .8 我 js 目录 web->js->login.js 页面引入js方法一: $this->registerJsFile('@web/js/login.js' ...
- 【Java EE 学习 71 下】【数据采集系统第三天】【分析答案实体】【删除问题】【删除页面】【删除调查】【清除调查】【打开/关闭调查】
一.分析答案实体 分析答案实体主要涉及到的还是设计上的问题,技术点几乎是没有的.首先需要确定一下答案的格式才能最终确定答案实体中需要有哪些属性. 答案格式的设计是十分重要的,现设计格式如下: 在表单中 ...
- 协议分析TMP
最近闲来有事, 分析了一个非常低端(非常低端的意思是说你不应该对她是否能取代你现有的QQ客户端作任何可能的奢望,她只是一个实验性的东西)的手机QQ的协议, 是手机QQ3.0, 所用到的TCP ...
- 【leetcode】Median of Two Sorted Arrays
题目简述: There are two sorted arrays A and B of size m and n respectively. Find the median of the two s ...
- 两个select 左右添加,上下移动
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- spring 定时任务配置
1.(易)如何在spring中配置定时任务? spring的定时任务配置分为三个步骤: 1.定义任务 2.任务执行策略配置 3.启动任务 (程序中一般我们都是到过写的,直观些) 1.定义任务 < ...