Cod sursa(job #4512)

Utilizator gigi_becaliGigi Becali gigi_becali Data 5 ianuarie 2007 11:22:19
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <cstdio>
#include <deque>
#include <multiset.h>
#include <set>
#define maxn 10001
#define maxk 51
using namespace std;

int n, k;
int x[maxn*maxk], y[maxn*maxk], T;
struct nod{ int n, w;};

struct cmp{
  bool operator()(const nod &a, const nod &b) const
  {
    if(a.w>b.w) return 1;
    if(a.w==b.w) if(a.n<b.n) return 1;
    return 0;
  }
};

 set<nod, cmp> Q;
set<nod, cmp>::iterator it, iit;



void citire()
{
  freopen("kreg.in", "r", stdin);
  scanf("%d %d\n", &k, &n);
}

void calcul()
{
  int i,j;
  
  nod t, u;
  t.w=k;
  for(i=1;i<=n;i++)
    {
      t.n=i;
      Q.insert(t);
    }
  
  
  for(i=1;i<=n;i++)
    {
      t=*Q.begin();
      Q.erase(t);
      
      deque<nod> R;
      
      for(j=1, it=Q.begin();j<=t.w && it!=Q.end(); it++)
	if((t.n==1 && it->n==n) || (t.n==n && it->n==1) || ( t.n==it->n+1) || (t.n==it->n-1)) ;
	else 
	{
	  ++T;
	  x[T]=t.n;
	  y[T]=it->n;
	  R.push_back(*it);
	  iit=it;
	  j++;
	}
      for(j=0;j<t.w;j++) Q.erase(R[j]);
      for(j=0;j<t.w;j++) R[j].w--;
      for(j=0;j<t.w;j++) Q.insert(R[j]);
	}
}

int main()
{
  citire();
  k-=2;
  calcul();
  freopen("kreg.out", "w", stdout);
  for(int i=1;i<n;i++) printf("%d %d\n", i, i+1);
  printf("%d %d\n", n, 1);
  for(int i=1;i<=T;i++) printf("%d %d\n",x[i], y[i]); 
  
  return 0;
}