Codeforces Round #335 (Div. 2) D. Lazy Student 贪心

D. Lazy Student

Student Vladislav came to his programming exam completely unprepared as usual. He got a question about some strange algorithm on a graph — something that will definitely never be useful in real life. He asked a girl sitting next to him to lend him some cheat papers for this questions and found there the following definition:

The minimum spanning tree T of graph G is such a tree that it contains all the vertices of the original graph G, and the sum of the weights of its edges is the minimum possible among all such trees.

Vladislav drew a graph with n vertices and m edges containing no loops and multiple edges. He found one of its minimum spanning trees and then wrote for each edge its weight and whether it is included in the found tree or not. Unfortunately, the piece of paper where the graph was painted is gone and the teacher is getting very angry and demands to see the original graph. Help Vladislav come up with a graph so that the information about the minimum spanning tree remains correct.

Input

The first line of the input contains two integers n and m () — the number of vertices and the number of edges in the graph.

Each of the next m lines describes an edge of the graph and consists of two integers aj and bj (1 ≤ aj ≤ 109, bj = {0, 1}). The first of these numbers is the weight of the edge and the second number is equal to 1 if this edge was included in the minimum spanning tree found by Vladislav, or 0 if it was not.

It is guaranteed that exactly n - 1 number {bj} are equal to one and exactly m - n + 1 of them are equal to zero.

Output

If Vladislav has made a mistake and such graph doesn‘t exist, print  - 1.

Otherwise print m lines. On the j-th line print a pair of vertices (uj, vj) (1 ≤ uj, vj ≤ n, uj ≠ vj), that should be connected by the j-th edge. The edges are numbered in the same order as in the input. The graph, determined by these edges, must be connected, contain no loops or multiple edges and its edges with bj = 1 must define the minimum spanning tree. In case there are multiple possible solutions, print any of them.

Sample test(s)

input

4 52 13 14 01 15 0

output

2 41 43 43 13 2

input

3 31 02 13 1

output

-1

 题意:

给你n 个点,m条边的树,题目作出一个最小生成树,,  告诉你哪些是最小生成树的边及其权值,让你构造一颗树 满足条件

题解:

贪心,我们在按照权值从小到大排序,让最小生成树的边设定为1-x就可以了

  其他非最小生成树边 就是x-y了,以y递增为尾,找齐小于y的x就是最佳

//meek
///#include<bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <stack>
#include <sstream>
#include <vector>
using namespace std ;
typedef long long ll;
#define mem(a) memset(a,0,sizeof(a))
#define pb push_back
#define fi first
#define se second
#define MP make_pair
inline ll read()
{
    ll x=0,f=1;
    char ch=getchar();
    while(ch<‘0‘||ch>‘9‘)
    {
        if(ch==‘-‘)f=-1;
        ch=getchar();
    }
    while(ch>=‘0‘&&ch<=‘9‘)
    {
        x=x*10+ch-‘0‘;
        ch=getchar();
    }
    return x*f;
}
//****************************************

const int N=250000+100;
const ll inf = 1ll<<61;
const int mod= 1000000007;

struct ss {
   int w,d,id;
}a[N];
int cmp(ss s1,ss s2) {
    if(s1.w==s2.w) return s1.d>s2.d;
    return s1.w<s2.w;
}
int n,m,vis[N];
vector< pair<int,pair<int ,int > > > ans;
int main () {
        int flag=0;
    scanf("%d%d",&n,&m);
    for(int i=1; i<=m; i++) {
        scanf("%d%d",&a[i].w,&a[i].d);
        a[i].id=i;
    }
    sort(a+1,a+m+1,cmp);
    int aim=n-1;
    int ans1=1,ans2=2,l=2,r=2;
    vis[1]=vis[2]=1;
    for(int i=1;i<=m;i++) {
        if(a[i].d==0) {
          if(!vis[r]) {
            flag=1;
           }
           if(l==r) {
            r++;
            l=2;
           }if(!vis[r]) {
            flag=1;
           }
           ans.pb(MP(a[i].id,MP(l,r)));
           l++;
        }
        else {
                ans.pb(MP(a[i].id,MP(ans1,ans2)));
                vis[ans2]=1;
                ans2+=1;
        }
    }
    if(flag) {
        cout<<-1<<endl;
        return 0;
    }
    sort(ans.begin(),ans.end());
    for(int i=0;i<ans.size();i++) {
        cout<<ans[i].se.fi<<" "<<ans[i].se.se<<endl;
    }
    return 0;
}

代码

时间: 2024-10-01 22:32:04

Codeforces Round #335 (Div. 2) D. Lazy Student 贪心的相关文章

Codeforces Round #335 (Div. 1)--C. Freelancer&#39;s Dreams 线性规划对偶问题+三分

题意:p, q,都是整数. sigma(Ai * ki)>= p, sigma(Bi * ki) >= q; ans = sigma(ki).输出ans的最小值 约束条件2个,但是变量k有100000个,所以可以利用对偶性转化为求解 ans = p * y1 + q * y2 约束条件为: Ai * y1 + Bi * y2 <= 1 其中i为0~n-1 也就是n个约束条件. 后面三分搞搞就好了 1 #include <bits/stdc++.h> 2 using names

Codeforces Round #335 (Div. 2) C. Sorting Railway Cars 连续LIS

C. Sorting Railway Cars An infinitely long railway has a train consisting of n cars, numbered from 1 to n (the numbers of all the cars are distinct) and positioned in arbitrary order. David Blaine wants to sort the railway cars in the order of increa

Codeforces Round #335 (Div. 2)

水 A - Magic Spheres 这题也卡了很久很久,关键是“至少”,所以只要判断多出来的是否比需要的多就行了. #include <bits/stdc++.h> using namespace std; #define lson l, mid, o << 1 #define rson mid + 1, r, o << 1 | 1 typedef long long ll; const int N = 1e5 + 5; const int INF = 0x3f3f

Codeforces Round #140 (Div. 1) Naughty Stone Piles 贪心

#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const int maxn = 1000010; __int64 sum[maxn] ; __int64 num[maxn]; __int64 ans[maxn]; __int64 vis[maxn] ; __int64 qu

Codeforces Round #140 (Div. 1)D The table 贪心

#include<iostream> #include<cstdio> #include<cstring> using namespace std ; const int maxn = 110 ; int sum_r[maxn] ; int sum_c[maxn] ; int vis_c[maxn] ;int vis_r[maxn] ; int ans_c[maxn] ;int ans_r[maxn] ; int table[maxn][maxn] ; void ini

Codeforces Round #276 (Div. 1)D.Kindergarten DP贪心

D. Kindergarten In a kindergarten, the children are being divided into groups. The teacher put the children in a line and associated each child with his or her integer charisma value. Each child should go to exactly one group. Each group should be a

Codeforces Round #273 (Div. 2) B . Random Teams 贪心

B. Random Teams n participants of the competition were split into m teams in some manner so that each team has at least one participant. After the competition each pair of participants from the same team became friends. Your task is to write a progra

Codeforces Round #316 (Div. 2) B Simple Game 贪心

贪心,如果m分成的两个区间长度不相等,那么选长的那个区间最接近m的位置,否则选m-1位置,特判一下n等于1的情况 #include<bits/stdc++.h> using namespace std; int main() { int n,m; scanf("%d%d",&n,&m); if(n == 1){ printf("1"); return 0; } int d1 = m-1, d2 = n-m; if(d1<d2){ p

Codeforces Round #363 (Div. 2) C dp或贪心 两种方法

Description Vasya has n days of vacations! So he decided to improve his IT skills and do sport. Vasya knows the following information about each of this n days: whether that gym opened and whether a contest was carried out in the Internet on that day