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] ...
随机推荐
- javaSE基础05
javaSE基础05:面向对象 一.数组 数组的内存管理 : 一块连续的空间来存储元素. Int [ ] arr = new int[ ]; 创建一个int类型的数组,arr只是一个变量,只是数组的一 ...
- PEtools
// PETools.cpp : Defines the entry point for the console application.// #include "stdafx.h" ...
- shell 脚本随机抽取班级学生
#/bin/bash jw=(name1,name2,name3......name39) ..} do a=$(date +%N) b=$() ]" "${jw[$b]} don ...
- python中的反射
在绝大多数语言中,都有反射机制的存在.从作用上来讲,反射是为了增加程序的动态描述能力.通俗一些,就是可以让用户参与代码执行的决定权.在程序编写的时候,我们会写很多类,类中又有自己的函数,对象等等.这些 ...
- Swift - UIBezierPath
使用UIBezierPath可以创建基于矢量的路径.使用此类可以定义简单的形状,如椭圆.矩形或者有多个直线和曲线段组成的形状等.主要用到的该类的属性包括 moveToPoint: //设置起始点 ad ...
- JSP网页处理过程
以下步骤表明了Web服务器是如何使用JSP来创建网页的: 就像其他普通的网页一样,您的浏览器发送一个HTTP请求给服务器. Web服务器识别出这是一个对JSP网页的请求,并且将该请求传递给JSP引擎 ...
- 在nginx中配置ip直接访问的默认站点
一台机子部署多个网站,我们直接访问ip (外网内网都一样)提示无法访问或404. 因为有多个网站,我们想指定某个网站为IP访问默认的网站,如何操作呢? 解:在Listen ip:port; 这个指令行 ...
- python 学习笔记7 面向对象编程
一.概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发"更快更好更强..." ...
- spring boot使用
首先spring-boot是个服务框架,更加准确来讲是个微服务框架,实际上来说”微“并不“微”,spring-boot包含很多可嵌入的组件,通过这些组件可以来完成我们的服务, 以往我们使用Spring ...
- CozyRSS开发记录11-够用的RSS源管理
CozyRSS开发记录11-够用的RSS源管理 1.分析需求 先随手画个用例图来看看有哪些参与者会访问我们的源管理: 2.搞一个Controller类 根据前面分析得出的用例图,我们就可以来设计实现一 ...