Cod sursa(job #137557)

Utilizator Binary_FireFlorin Pogocsan Binary_Fire Data 17 februarie 2008 12:39:33
Problema Nivele Scor 100
Compilator cpp Status done
Runda preONI 2008, Runda 4, Clasele 11-12 Marime 1.71 kb
#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

#define DxBG

#define fin  "nivele.in"
#define fout "nivele.out"

#define pb push_back

const int Nmax = 50100;

int N,T;
vector <int> v;

int bun()
{
    int i,j,cnt,lev,nr_nod;
    
    nr_nod = 0;
    
    lev = v[0] + 1;
    
    for ( i = 0; i < N; )
    {   
        if ( lev - 1 != v[i] )
        {
           while ( lev - 1 != v[i] && nr_nod ) 
           {
                 --lev;
                 nr_nod /= 2;
           }
           
           if ( nr_nod == 0 )
              return 0;
        }
        
        for ( j = i, cnt = 0; j < N && v[j] == v[i]; ++j ) ++cnt;
        
        #ifdef DBG
               printf("%d %d %d\n",nr_nod,v[i],cnt);
        #endif
        
        if ( nr_nod % 2 != cnt % 2 )
           return 0;
           
        nr_nod = ( nr_nod + cnt ) / 2;
        
        lev = v[i];
        
        i = j;
    }
    
    --lev;
    while ( lev != 1 && nr_nod ) { nr_nod /= 2; --lev; };
    
    if ( lev != 1 || nr_nod != 1 )
       return 0;
       
    return 1;
}

void readsolve()
{
     int i,lev;
     
     freopen(fin,"r",stdin);
     freopen(fout,"w",stdout);

     scanf("%d",&T);
     
     while ( T -- )
     {
           scanf("%d",&N);
           v.clear();
           for ( i = 0; i < N; ++i )
           {
              scanf("%d",&lev);
              v.pb(lev);     
           }
           
           sort(v.rbegin(),v.rend());
           
           if ( bun() )
               printf("DA\n");
           else
               printf("NU\n");
     }          
}

int main()
{
    readsolve();
    return 0;    
}