题干:

The board has got a painted tree graph, consisting of n nodes. Let us remind you that a non-directed graph is called a tree if it is connected and doesn't contain any cycles.

Each node of the graph is painted black or white in such a manner that there aren't two nodes of the same color, connected by an edge. Each edge contains its value written on it as a non-negative integer.

A bad boy Vasya came up to the board and wrote number sv near each node v — the sum of values of all edges that are incident to this node. Then Vasya removed the edges and their values from the board.

Your task is to restore the original tree by the node colors and numbers sv.

Input

The first line of the input contains a single integer n (2 ≤ n ≤ 105) — the number of nodes in the tree. Next n lines contain pairs of space-separated integers cisi(0 ≤ ci ≤ 1, 0 ≤ si ≤ 109), where ci stands for the color of the i-th vertex (0 is for white, 1 is for black), and si represents the sum of values of the edges that are incident to the i-th vertex of the tree that is painted on the board.

Output

Print the description of n - 1 edges of the tree graph. Each description is a group of three integers viuiwi (1 ≤ vi, ui ≤ nvi ≠ ui, 0 ≤ wi ≤ 109), where vi and ui— are the numbers of the nodes that are connected by the i-th edge, and wi is its value. Note that the following condition must fulfill cvi ≠ cui.

It is guaranteed that for any input data there exists at least one graph that meets these data. If there are multiple solutions, print any of them. You are allowed to print the edges in any order. As you print the numbers, separate them with spaces.

Examples

Input

3
1 3
1 2
0 5

Output

3 1 3
3 2 2

Input

6
1 0
0 3
1 8
0 2
0 3
0 0

Output

2 3 3
5 3 3
4 3 2
1 6 0
2 1 0

题目大意:

给你n个点,然后是每个点的颜色(用0或1表示)和 与这个点相邻的边的权值,让你恢复一棵树(输出格式为u,v,w(边权))

解题报告:

首先告诉你一定有解了,那么我们只需要构造出一组解就可以了。(因为说明黑色的点的权值之和 等于 白色的点的权值之和)构造的方法选择贪心,每次选择两个最小的黑白点然后 把权值较小的全都连到权值较大的边上,最后别忘了特判剩下的顶点全为0的情况。。。细节不少啊。

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
#define fi first
#define se second
using namespace std;
const int MAX = 2e5 + 5;
vector<pair<int, int> > a,b;//1==黑 0==白
int main()
{int n;//cout << (1,0) << endl;cin>>n;for(int i=1,col,w; i<=n; i++) {scanf("%d%d",&col,&w);if(col) a.pb(pm(w,i));else b.pb(pm(w,i));}sort(a.begin(),a.end());sort(b.begin(),b.end());
//  for(int i = 0; i<a.size(); i++) printf("%d %d\n",a[i].fi,a[i].se);int cnt1=0,cnt2=0;int up1=a.size();int up2=b.size();
//  int zero1=0,zero2=0;
//  while(a[zero1].fi == 0) zero1++;
//  while(b[zero2].fi == 0) zero2++;while(cnt1 < up1 && cnt2 < up2) {int tmp = min(a[cnt1].fi,b[cnt2].fi);printf("%d %d %d\n",a[cnt1].se,b[cnt2].se,tmp);a[cnt1].fi -= tmp;b[cnt2].fi -= tmp;
//      if(a[cnt1].fi) cnt2++;
//      else if(b[cnt2].fi) cnt1++;if(a[cnt1].fi == 0 && cnt1 < up1-1) cnt1++;else if(b[cnt2].fi == 0 && cnt2 < up2-1) cnt2++;else if(cnt1 < up1-1) cnt1++;else cnt2++;}return 0 ;}

或者用上面那两行注释的也可以。

这样写是不对的:

 while(cnt1 < up1 && cnt2 < up2) {int tmp = min(a[cnt1].fi,b[cnt2].fi);printf("%d %d %d\n",a[cnt1].se,b[cnt2].se,tmp);a[cnt1].fi -= tmp;b[cnt2].fi -= tmp;
//      if(a[cnt1].fi) cnt2++;
//      else if(b[cnt2].fi) cnt1++;if(a[cnt1].fi == 0 && cnt1 < up1) cnt1++;else if(b[cnt2].fi == 0 && cnt2 < up2) cnt2++;

对于这样的样例

6
0 0
1 0
0 0
1 0
0 0
1 0

是过不了的、、所以必须cnt1<up1-1这样,对于其他的情况再另行判断

总结:

好cai啊、、、5555又被虐了

其实为了避免上面那些 繁琐的情况,还可以用优先队列写,最后清空的时候直接暴力清空就可以了。

【CodeForces - 260D】Black and White Tree (思维构造,猜结论,细节,构造一棵树)相关推荐

  1. 【CodeForces - 1042C】Array Product(思维,有坑细节)

    题干: You are given an array aa consisting of nn integers. You can perform the following operations wi ...

  2. CodeForces 658C Bear and Forgotten Tree 3(构造)

    题意:构造一棵树,有N个点,直径为d,深度为h 思路:首先构造一个长度为d的链,然后把其中一个距离边上为h的点变为根.然后我们就不停的在距离根为h上面的那一点不停的加点就好了,使得新加入的点的距离也为 ...

  3. 【CodeForces - 298C】Parity Game (思维,有坑)

    题干: You are fishing with polar bears Alice and Bob. While waiting for the fish to bite, the polar be ...

  4. CodeForces - 1324 D. Pair of Topics 思维+多解法

    CodeForces - 1324 D. Pair of Topics 原题地址: http://codeforces.com/contest/1324/problem/D 基本题意: 给你一个数组, ...

  5. 【VK Cup 2016 - Round 1 (Div 2 Edition)C】【构造】Bear and Forgotten Tree 3 构造一棵树直径为d且点1的深度为h

    Bear and Forgotten Tree 3 time limit per test 2 seconds memory limit per test 256 megabytes input st ...

  6. 【AGC035C】Skolem XOR Tree【异或】【构造】

    传送门 题意:给定nnn,构造或判断无法构造一个2n2n2n个结点的树,其中结点iii和i+ni+ni+n的权值为iii,且所有iii和i+ni+ni+n路径权值异或和等于iii. 注意到 2i⊕2i ...

  7. codeforces 963B Destruction of a Tree

    B. Destruction of a Tree time limit per test 1 second memory limit per test 256 megabytes input stan ...

  8. LeetCode——Same Tree(判断两棵树是否相同)

    问题: Given two binary trees, write a function to check if they are equal or not. Two binary trees are ...

  9. Codeforces Round #396 (Div. 2) E. Mahmoud and a xor trip 二进制拆位+树型dp

    E. Mahmoud and a xor trip 链接: http://codeforces.com/contest/766/problem/E 题意: 给定一颗n节点的树以及每个节点的权值,另di ...

最新文章

  1. qq分享组件 android,移动端,分享插件
  2. Python 面试总结
  3. 新手学习Linux——rsync+shell脚本完成自动化备份
  4. 阿里巴巴开源 Spring Cloud Alibaba,加码微服务生态建设
  5. ElasticSearch映射Mapping
  6. java遍历json的key和value_json对象遍历输出key和value
  7. 虚拟网站禁用php,虚拟主机php程序fsockopen函数被禁用
  8. CLR via C# 中关于装箱拆箱的摘录
  9. python互相转换组合_Python中基本类型的连接组合和互相转换13种方式
  10. Android Studio导入从Github下载的源码
  11. Qi v1.2.4协议 之 9 Stand-by Power 【英文翻译】
  12. Linux中fork函数详解(附图解与代码实现)
  13. windos读写ext3工具_Win7下读写Ext2/Ext3/Ext4文件系统
  14. 弘辽科技:直通车引流逻辑。
  15. 分布式部署 Zabbix 监控平台
  16. html5 lang属性都有哪些语言,HTML5中的lang属性,zh
  17. 【error】_smartbi数据集超出最大行数: DataRows > 1000
  18. float 与 double 的区别
  19. Xshell远程登录本地虚拟机(保姆级教学)
  20. 单独编译和使用webrtc音频降噪模块(NS)

热门文章

  1. mysql日期格式化季度_mysql按年度、季度、月度、周、日统计查询的sql语句
  2. canvas绘制图像image
  3. 1006 换个格式输出整数 (15 分)
  4. python答疑的作用_不学Python之集中答疑(5)
  5. 计算机网络实用期末试题和答案,计算机网络期末考试试题及答案(1)
  6. C#命名空间namespace中不能直接包含字段(变量)或方法(函数)之类的成员
  7. linux apache24 使用,科学网—linux_centos第24_2次课Apache的安装 - 郭会强的博文
  8. python opencv输出mp4_Python玩转视频处理(四):视频按场景进行分割
  9. 405 not allowed什么意思_二驴质问散打:为什么不救天道!面临一个亿赔款?次惑小仙女宣布与可乐分手!...
  10. 详解公钥、私钥、数字证书的概念