codeforces 1283F. DIY Garland(树+优先队列)
题目连接:https://codeforces.com/contest/1283/problem/F
题意:一根电线连接着两个点,这两个点分别代表着两个灯,灯有自己的编号i,其亮度是2 ^ i,每根电线的两个灯分别为主灯和副灯,电源从主灯来,电流向副灯。最开始有一个源点灯,所有的电源从此处流入,对于每根电线,定义其重要性为 :切断这根电线后不能通电的所有灯的亮度之和。首先题目按电线的重要性给出n-1条电线的主灯编号,让你从大到小输出每条电线所连接的两个灯的序号(无前后差别)
题解:首先,题目的所描述的结构是一棵树,因为题目是按电线重要性给出的节点主灯,那么第一个节点必定是源点,因为重要性最大。其次因为树的叶子节点度必为1,而且叶子节点必定不是主灯,那么我们可以在输入之后统计叶子节点,同时统计一下输入节点的度。叶子节点的编号用优先队列存储,因为亮度最小最先和重要性低的电线匹配。因为输入的时候电线是按重要性从大到小输入的,那么我们就可以把优先队列中的节点一个一个地与其父亲节点(主灯)匹配,匹配过后,让当前这个主灯的度-1,如果这个此时度变为1,那么加入到优先队列之中,因为他现在成了“叶子节点”,如此过程直到把n-1条边都找到,break即可
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
const int maxn = 2e5+;
int ind[maxn];
vector<pair<int,int> > ans;
int main(){
int n;
cin>>n;
priority_queue<int, vector<int>,greater<int> > q;
vector<int> mainLamp;
int gird = -;
for(int i = ;i<n-;i++){
int lamp;
cin>>lamp;
if(gird == -) gird = lamp;//记录源点
ind[lamp]++;//记录度
mainLamp.push_back(lamp);
}
for(int i = ;i<=n;i++){
if(ind[i] == ){//寻找未出现的叶子节点
q.push(i);
}
}
while(!q.empty() ){
int cur = q.top();
q.pop();
int curMainLamp = mainLamp[mainLamp.size()-];
mainLamp.pop_back();//匹配一个主灯,就弹出一个
ans.push_back({curMainLamp,cur});//加入一条边
if(ans.size() == n - ) break;
ind[curMainLamp]--;
if(ind[curMainLamp] == ){
q.push(curMainLamp);//如果度为0,那么变成了叶子节点,加入队列中
}
}
cout<<gird<<endl;
for(int i = ans.size() -;i>= ;i--){
cout<<ans[i].first<<" "<<ans[i].second<<endl;
}
return ;
}
codeforces 1283F. DIY Garland(树+优先队列)的更多相关文章
- poj3253 Fence Repair【哈夫曼树+优先队列】
Description Farmer John wants to repair a small length of the fence around the pasture. He measures ...
- Codeforces I. Producing Snow(优先队列)
题目描述: C. Producing Snow time limit per test 1 second memory limit per test 256 megabytes input stand ...
- [Codeforces 1208D]Restore Permutation (树状数组)
[Codeforces 1208D]Restore Permutation (树状数组) 题面 有一个长度为n的排列a.对于每个元素i,\(s_i\)表示\(\sum_{j=1,a_j<a_i} ...
- CodeForces - 767C Garland 树的遍历
C. Garland time limit per test 2 seconds memory limit per test 256 megabytes input standard input ou ...
- codeforces 734E(DFS,树的直径(最长路))
题目链接:http://codeforces.com/contest/734/problem/E 题意:有一棵黑白树,每次操作可以使一个同色连通块变色,问最少几次操作能使树变成全黑或全白. 思路:先进 ...
- codeforces 725D . Contest Balloons(贪心+优先队列)
题目链接:codeforces 725D . Contest Balloons 先按气球数从大到小排序求出初始名次,并把名次排在第一队前面的队放入优先队列,按w-t-1值从小到大优先,然后依次给气球给 ...
- codeforces 706D (字典树)
题目链接:http://codeforces.com/problemset/problem/706/D 题意:q次操作,可以向多重集中增添,删除,询问异或最大值. 思路:转化为二进制用字典树存储,数字 ...
- bzoj2006 noi2010 超级钢琴 主席树 + 优先队列
Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2435 Solved: 1195 Description 小 Z是一个小有名气的钢琴家,最近C博士送 ...
- BZOJ 2006 超级钢琴(划分树+优先队列)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2006 题意: 给出一个数列A,L,R,构造出一个新的集合,集合中的数字为A中任意连续t( ...
随机推荐
- 【Android】LitePal的基础
一.环境配置 LitePal 在GitHub地址为:https://github.com/LitePalFramework/LitePal 我们使用起来也很方便,直接在gradle中配置即可. 如果你 ...
- [CF1311D] Three Integers - 数学
Solution 枚举 \(a\),枚举 \(b\ s.t. a|b\),则 \(c\) 一定是 \([c/b]b\) 或 \(([c/b]+1)b\) #include <bits/stdc+ ...
- vue-cli莫名其妙的警告
好久没有写笔记了,看着以前写的笔记有很多不合理的地方也没有去改正,这里抽空记录一个vue-cli莫名其妙的警告,虽然现在我也是一脸懵逼,但是还好把问题处理了. 出现的的问题是: 项目运行时出现警告 T ...
- 小白的java学习之路 “ 选择结构(二)”
switch 选择结构: 为什么使用switch选择结构: switch选择结构可以更好地解决等值判断问题. switch选择结构的四个关键字: switch case default ...
- JS DOM操作(创建、遍历、获取、操作、删除节点)
创建节点 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="u ...
- 复原IP地址
这道题有点不好理解 export default (str) => { // 保存所有符合条件的IP地址 let r = [] // 分四步递归处理ip分段 let search = (cur, ...
- Ubuntu在当前用户目录下安装python 包
对于tar.gz文件: tar -zxvf setuptools-19.6.tar.gz cd setuptools-19.6.tar.gz python3 setup.py build python ...
- gulp常用插件之gulp-cache使用
更多gulp常用插件使用请访问:gulp常用插件汇总 gulp-cache这是一款基于临时文件的gulp缓存代理任务. 更多使用文档请点击访问gulp-cache工具官网. 安装 一键安装不多解释 n ...
- easyui datagrid设置排序
sortable="true" order="desc" 或者 sortable:true,order:'desc'
- BLE直接Data channel抓包方法汇总
之前一致在做一些有关与BLE安全研究的“基础设施建设”工作,我们知道,在BLE进入跳频之后,所有的固定标志都会消失,但是是不是意味着没办法了?不是的.我会提出一些恢复出来的方法. 首先,前导码分析,B ...