(LightOj) 1281 – New Traffic System

0

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>

#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<utility>
#include<set>


#define FOR(i, s, e) for(int i=s; i<e; i++)
#define loop(i, n) FOR(i, 0, n)
#define sf scanf
#define pf printf
#define pb push_back
#define MP make_pair
#define fr first
#define sc second
#define ll long long
#define dd double
#define all(v) v.begin(), v.end()
#define PI acos(-1.0)
#define mem(ara, value) memset(ara, value, sizeof(ara))
#define paii pair<int, int>
#define pall pair<ll, ll>
#define SZ(a) int(a.size())
#define read(nm) freopen(nm, "r", stdin)
#define write(nm) freopen(nm, "w", stdout)
#define dump(x) cout<<#x<<" = "<<x<<endl

using namespace std;

#define take(args...) asdf,args
#define debug(args...) asdfg,args; cout<<endl
struct ASDF{
    ASDF& operator,(int &a) {
        sf("%d", &a);
        return *this;
    }
    ASDF& operator,(long int &a){
        sf("%ld", &a);
        return *this;
    }
    ASDF& operator,(long long int &a){
        sf("%lld", &a);
        return *this;
    }
    ASDF& operator,(char &c){
        sf("%c", &c);
        return *this;
    }
    ASDF& operator,(double &d){
        sf("%lf", &d);
        return *this;
    }

    template<typename T>
    ASDF& operator,(T &a){
        cin>>a;
        return *this;
    }
}asdf;
struct ASDFG{
    template<typename T>
    ASDFG& operator,(vector<T> &v){
        pf("[");
        cout<<v[0];
        FOR(i, 1, SZ(v)){
            cout<<", "<<v[i];
        }
        pf("]");
        return *this;
    }

    template<typename T>
    ASDFG& operator,(T x) {
        cout<<x<<" ";
        return *this;
    }


}asdfg;



//Header ends here

#define MAXX 10003

struct graphNode{
    int weight;
    int v;
    bool isProposedRoad;
};
struct node{
    int cost;
    int used;
    int u;

    bool operator<(const node &ob) const
    {
        return this->cost > ob.cost;
    }
};



vector<graphNode>graph[MAXX];
int n, m, k, d;
int dist[11][MAXX];



int dijkstra()
{
    //cerr<<endl;
    node u, v;
    u.u = u.cost = u.used = 0;

    mem(dist, 1);
    dist[0][0] = 0;


    priority_queue<node>Q;
    Q.push(u);


    while(!Q.empty())
    {
        u = Q.top(); Q.pop();
        //cerr<<"dist["<<u.u<<"]["<<u.used<<"] = "<<u.cost<<endl;
        if(u.cost != dist[u.used][u.u]) continue;
        if(u.u == n-1)
        {
            //dump(u.cost);
            return u.cost;
        }

        loop(i, SZ(graph[u.u]))
        {
            //cerr<<u.u<<" -->"<<graph[u.u][i].v<<endl;
            v.u = graph[u.u][i].v;
            v.cost = graph[u.u][i].weight + u.cost;
            v.used = u.used + (graph[u.u][i].isProposedRoad?1:0);


            if(v.used <= d && v.cost < dist[v.used][v.u] )
            {
                dist[v.used][v.u] = v.cost;
                Q.push(v);
                //cerr<<"pushing "<<v.u<<" with cost "<<v.cost<<endl;
            }
        }
    }

    return -1;
}




int main()
{
    int kases, kaseno = 0;

    take(kases);

    while(kases--)
    {



        graphNode aNode;
        take(n, m, k, d);


        loop(i, n) graph[i].clear();

        int u, v, w;
        aNode.isProposedRoad = false;
        loop(i, m)
        {
            take(u, v, w);
            aNode.weight = w;
            aNode.v = v;
            graph[u].pb(aNode);
        }

        aNode.isProposedRoad = true;

        loop(i, k)
        {
            take(u, v, w);
            aNode.weight = w;
            aNode.v = v;
            graph[u].pb(aNode);
        }

        int res = dijkstra();
        if(res == -1) pf("Case %d: Impossible\n", ++kaseno);
        else pf("Case %d: %d\n", ++kaseno, res);


    }



}


(UVa) 10226 – Hardwood Species

0
/*
user: php
link: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=1167
*/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>

#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<utility>


#define FOR(i, s, e) for(int i=s; i<e; i++)
#define loop(i, n) FOR(i, 0, n)
#define gi(a) sf("%d", &a)
#define gi2(a, b) sf("%d%d", &a, &b)
#define gi3(a, b, c) sf("%d%d%d", &a, &b, &c)
#define gi4(a, b, c, d) sf("%d%d%d%d", &a, &b, &c, &d)
#define sf scanf
#define pf printf
#define pb push_back
#define MP make_pair
#define fr first
#define sc second
#define ll long long
#define dd double
#define all(v) v.begin(), v.end()
#define PI acos(-1.0)
#define mem(ara, value) memset(ara, value, sizeof(ara))
#define paii pair<int, int>
#define pall pair<ll, ll>
#define SZ(a) int(a.size())
#define read freopen("input.txt", "r", stdin)
#define write freopen("output.txt", "w", stdout)

using namespace std;


#define ALPHA_LIST 128

struct node{
    int cnt_trees;
    node *child[ALPHA_LIST];

    node()
    {
        cnt_trees = 0;
        loop(i, ALPHA_LIST)
        {
            child[i] = NULL;
        }
    }
}*head;

int total;


/*
void clearTree(node *p)
{
    loop(i, ALPHA_LIST)
    {
        if(p->child[i] != NULL)
        {
            clearTree(p->child[i]);
        }
    }
    delete p;
}

void init()
{
    head = new node();
}


int toint(char c)
{
    if(c== ' ')
        return 26;
    if('a' <= c && c <= 'z')
        return c - 'a';
    else
        return c - 'A';
}
*/

void insert(char *word)
{
    //cout<<"inserting " << word<<endl;
    node *current = head;

    int ch;

    while(*word != '\0')
    {
        ch = *word;

        if(current->child[ch] == NULL)
            current->child[ch] = new node();
        current = current->child[ch];
        word++;
    }
    current->cnt_trees++;
}

vector<char> name_list;

void printTree(node *current)
{
    if(current->cnt_trees)
    {
        FOR(i, 0, SZ(name_list))
        {
            pf("%c", name_list[i]);
        }
        pf(" %.4lf\n", (100.0*current->cnt_trees)/(double)total);
        //current->cnt_trees = 0;
    }

    loop(i, ALPHA_LIST)
    {
        if(current->child[i] != NULL)
        {
            name_list.pb(i);
            printTree(current->child[i]);
            name_list.pop_back();
        }
    }

    delete current;
    //current = NULL;
}


int main()
{
    int kases;
    char names[35];
    bool blank = 0;

    gi(kases);
    cin.ignore();
    cin.ignore();

    while(kases--)
    {
        if(blank) pf("\n");
        blank = 1;

        head = new node();

        //init();

        //cout<<head<<endl;

        total = 0;
        while(gets(names))
        {
            if(strlen(names) == 0) break;
            insert(names);
            total++;
        }

        printTree(head);

        //head = NULL;
        //cout<<head<<endl<<endl<<endl;

        //clearTree(head);
    }


    return 0;
}


(SPOJ) 1043. Can you answer these queries I

0
/*
user: hasib
link: http://www.spoj.com/problems/GSS1/
*/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>

#include<string>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#include<sstream>


#define loop(i, n) for(int i=0; i<n; i++)
#define FOR(i, s, e) for(int i=s; i<e; i++)
#define mem(a, v) memset(a, v, sizeof(a))
#define pb push_back
#define sf scanf
#define pf printf
#define getint(a) sf("%d", &a)
#define INF 1<<29
#define SZ(v) int(v.size())
#define pi acos(-1.0)
#define all(v) v.begin(), v.end()
#define read() freopen("input.txt", "r", stdin)
#define write() freopen("output.txt", "w", stdout)
#define ll long long
#define debug cout<<"came here"<<endl

using namespace std;

#define MAXX 50002

int cnt;


struct DATA{
    int prefixsum, suffixsum, fullsum, maxsum;
};

DATA sum[4*MAXX];


DATA merge(DATA a, DATA b)
{
    DATA result;

    result.fullsum = a.fullsum + b.fullsum;


    result.maxsum = max( a.maxsum, b.maxsum );
    result.maxsum = max( result.maxsum, a.suffixsum + b.prefixsum );

    result.prefixsum = max( a.prefixsum, a.fullsum + b.prefixsum  );

    result.suffixsum = max(b.suffixsum, b.fullsum + a.suffixsum);


    return result;
}




void insert_update(int idx, int st, int ed, int pos, int value)
{
    if(st == pos && pos == ed)
    {

        sum[idx].fullsum = sum[idx].maxsum  = sum[idx].prefixsum = sum[idx].suffixsum = value;
        return;
    }


    int l = idx<<1;
    int r = l + 1;
    int mid = (st + ed)/2;


    if(pos <= mid)
    {
        insert_update(l, st, mid, pos, value);
    }
    else
    {
        insert_update(r, mid+1, ed, pos, value);
    }

    sum[idx] = merge(sum[l], sum[r]);
}


DATA quer(int idx, int st, int ed, int i, int j)
{
    if(st == i && ed == j) return sum[idx];

    int l = idx<<1;
    int r = l + 1;
    int mid = (st + ed)/2;

    if(j <= mid)
    {
        return quer(l, st, mid, i, j);
    }
    else if( i> mid)
    {
        return quer(r, mid+1, ed, i, j);
    }
    else
    {
        return merge( quer(l, st, mid, i, mid), quer(r, mid+1, ed, mid+1, j) );
    }


}

int main()
{
    //read();
    DATA result;
    getint(cnt);
    int num;
    for(int i=1; i<=cnt; i++)
    {
        getint(num);
        insert_update(1, 1, cnt, i, num);
    }

    int m;
    getint(m);
    int p, q;
    loop(i, m)
    {
        getint(p); getint(q);

        result = quer(1, 1, cnt, p, q);
        pf("%d\n", result.maxsum);
    }
    return 0;


}

(LightOj) 1018 – Brush (IV)

0
/*
user: php
link: http://lightoj.com/volume_showproblem.php?problem=1018
time: 0.772 sec
*/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>

#include<string>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#include<sstream>


#define loop(i, n) for(int i=0; i<n; i++)
#define FOR(i, s, e) for(int i=s; i<e; i++)
#define mem(a, v) memset(a, v, sizeof(a))
#define pb push_back
#define sf scanf
#define pf printf
#define getint(a) sf("%d", &a)
#define INF 1<<29
#define SZ(v) int(v.size())
#define pi acos(-1.0)
#define all(v) v.begin(), v.end()
#define read() freopen("input.txt", "r", stdin)
#define write() freopen("output.txt", "w", stdout)


using namespace std;

#define ll long long


#define MAXX 17
#define check(mask, i) (mask & (1<<i))
#define set(mask, i) (mask | (1<<i))


struct DATA{
    int x, y;
};


DATA places[MAXX];
int number_of_dust;
ll dp[1<<MAXX];



bool sameTriangle(int i, int j, int k)
{
    return (places[j].y - places[i].y) * (places[k].x - places[i].x) == (places[j].x - places[i].x) * (places[k].y - places[i].y);
}





ll rec(int used)
{
    /*
    cout<<"calling ";
    loop(i, number_of_dust)
    {
        if(check(used, i) == 0) cout<<0;
        else cout<<1;
    }
    cout<<endl;
    */

    ll &ret = dp[used];

    if(ret != -1) return ret;

    int cnt = 0;

    loop(i, number_of_dust)
    {
        if(check(used, i) == 0) cnt++;
    }
    if(cnt == 1) return 1;


    ret = INF;

    loop(i, number_of_dust)
    {
        if(check(used, i) == 0)
        {

            int temp = (used | (1<<i));

            FOR(j, i+1, number_of_dust)
            {
                int bt = (used | (1<<i));
                if(check(temp, j) == 0)
                {
                    temp = temp | (1<<j);
                    bt = bt | (1<<j);


                    loop(k, number_of_dust)
                    {
                        if(check(temp, k) == 0 && sameTriangle(i, j, k))
                        {
                            temp = temp | (1<<k);
                            bt = bt | (1<<k);
                        }
                    }
                    ret = min(ret, 1 + rec(bt));
                }
            }
            break;
        }
    }
    return ret;
}


int main()
{
    int kases, kaseno = 0;
    getint(kases);

    while(kases--)
    {
        getint(number_of_dust);
        loop(i, number_of_dust)
        {
            getint(places[i].x); getint(places[i].y);
        }

        mem(dp, -1);
        dp[ (1<<number_of_dust) - 1 ] = 0;

        pf("Case %d: %lld\n", ++kaseno, rec(0));

    }

}

(UVa) 10051 – Tower of Cubes

0
/*
user: php
time: 0.108 sec
link: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=992
*/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>

#include<algorithm>
#include<vector>
#include<string>
#include<stack>
#include<queue>
#include<map>
#include<sstream>



#define FOR(i, s, e) for(int i=s; i<e; i++)
#define loop(i, n) for(int i=0; i<n; i++)
#define getint(n) scanf("%d", &n)
#define pb(a) push_back(a)
#define ll long long
#define SZ(a) int(a.size())
#define read() freopen("input.txt", "r", stdin)
#define write() freopen("output.txt", "w", stdout)
#define mem(a, v) memset(a, v, sizeof(a))
#define all(v) v.begin(), v.end()
#define pi acos(-1.0)
#define INF 1<<29
#define mod abs
#define pf printf
#define sf scanf


using namespace std;


int s(int c)
{
    if(c%2 == 0)
    {
        c++;
    }
    else
    {
        c--;
    }
    return c;
}



struct DATA{
    int pos, col;
    void set(int p, int c)
    {
        pos = p;
        col = c;
    }
};


DATA dir[502][7];
int numberofcubes;
int color[502][7];
int dp[502][7];

string name[] = {"front", "back", "left", "right", "top", "bottom"};

int longest(int pos, int c)
{
    int &ret = dp[pos][c];
    if(ret != -1) return ret;


    int nc;

    if(c % 2 == 0)
        nc = c + 1;
    else
        nc = c - 1;

    // c is the top color last;
    // nc is to be new color

    ret = 0;
    FOR(i, pos+1, numberofcubes)
    {
        loop(j, 6)
        {
            if(color[i][j] == color[pos][nc])
            {
                if( ret < longest(i, j) )
                {
                    ret = dp[i][j];
                    dir[pos][c].set(i, j);
                }
            }
        }
    }
    return ++ret;


}



int main()
{
    int maxcubes;
    int kaseno = 0;
    DATA it;
    bool blank = false;

    while(true)
    {
        getint(numberofcubes);
        if(numberofcubes == 0) break;
        loop(i, numberofcubes)
        {
            loop(j, 6)
            {
                getint(color[i][j]);
            }
        }

        mem(dp, -1);

        maxcubes = 0;

        loop(i, numberofcubes)
        {
            loop(j, 6)
            {
                if(maxcubes < longest(i, j) )
                {
                    it.set(i, j);
                    maxcubes = dp[i][j];
                }
            }
        }

        if(blank) pf("\n");
        blank = true;


        pf("Case #%d\n", ++kaseno);
        pf("%d\n", maxcubes);

        while(dp[it.pos][it.col] != 1)
        {
            pf("%d %s\n", it.pos+1, name[it.col].c_str());
            it.set(dir[it.pos][it.col].pos, dir[it.pos][it.col].col);
        }

        pf("%d %s\n", it.pos+1, name[it.col].c_str());




    }

    return 0;
}






(UVa) 10258 – Contest Scoreboard

0
/*
user: php
time: 0.008 sec
link: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1199
*/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>

#include<algorithm>
#include<vector>
#include<string>
#include<stack>
#include<queue>
#include<map>
#include<sstream>



#define FOR(i, s, e) for(int i=s; i<e; i++)
#define loop(i, n) for(int i=0; i<n; i++)
#define getint(n) scanf("%d", &n)
#define pb(a) push_back(a)
#define ll long long
#define SZ(a) int(a.size())
#define read() freopen("input.txt", "r", stdin)
#define write() freopen("output.txt", "w", stdout)
#define mem(a, v) memset(a, v, sizeof(a))
#define all(v) v.begin(), v.end()
#define pi acos(-1.0)
#define INF 1<<29
#define mod(a) (a>0?a:-a)
#define pf printf
#define sf scanf

using namespace std;

bool attendedteam[101];

struct DATA{
    int id;
    ll total;
    ll tried[10];
    bool solved[10];
    int totalsolved;

};

DATA teamdata[101];

bool comp(DATA a, DATA b)
{
    if(b.totalsolved > a.totalsolved)
    {
        return false;
    }
    else if(a.totalsolved == b.totalsolved)
    {
        if(a.total < b.total)
        {
            return true;
        }
        else
        {
            return a.id < b.id;
        }
    }
    else
    {
        return true;
    }
}



int main()
{
    bool blank = false;

    FOR(i, 1, 101)
    {
        teamdata[i].id = i;
    }
    int kases;
    getint(kases);
    cin.ignore();
    cin.ignore();
    stringstream ss;
    string str;


    int teamid, probid, timesplit;
    char verdict;

    while(kases--)
    {
        if(blank) pf("\n");
        blank = true;
        mem(attendedteam, 0);
        FOR(i, 1, 101)
        {
            teamdata[i].total = 0;
            teamdata[i].totalsolved = 0;
            FOR(j, 1, 10)
            {
                teamdata[i].tried[j] = 0;
                teamdata[i].solved[j] = 0;
            }
        }
        while(true)
        {
            getline(cin, str);
            if(SZ(str) == 0) break;
            ss.clear();
            ss<<str;
            ss>>teamid>>probid>>timesplit>>verdict;
            attendedteam[teamid] = 1;

            if(teamdata[teamid].solved[probid] == 0)
            {
                if(verdict == 'C' )
                {
                    teamdata[teamid].totalsolved++;
                    teamdata[teamid].solved[probid] = 1;
                    teamdata[teamid].total += teamdata[teamid].tried[probid] + timesplit;

                }
                else if(verdict == 'I')
                {
                    teamdata[teamid].tried[probid] += 20;
                }
            }
        }

        vector<DATA>v;

        FOR(i, 1, 101)
        {
            if(attendedteam[i])
            {
                v.pb(teamdata[i]);
            }
        }

        sort(all(v), comp);

        int len = SZ(v);
        loop(i, len)
        {
            pf("%d %d %lld\n", v[i].id, v[i].totalsolved, v[i].total);
        }





    }

    return 0;
}






(Timus) 1029. Ministry

0
/*
user: php
time: 0.093 sec
link: http://acm.timus.ru/problem.aspx?space=1&num=1029
*/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>

#include<algorithm>
#include<vector>
#include<string>
#include<stack>
#include<queue>
#include<map>
#include<sstream>



#define FOR(i, s, e) for(int i=s; i<e; i++)
#define loop(i, n) for(int i=0; i<n; i++)
#define getint(n) scanf("%d", &n)
#define pb(a) push_back(a)
#define ll long long
#define SZ(a) int(a.size())
#define read() freopen("input.txt", "r", stdin)
#define write() freopen("output.txt", "w", stdout)
#define mem(a, v) memset(a, v, sizeof(a))
#define all(v) v.begin(), v.end()
#define pi acos(-1.0)
#define INF 10000000000
#define mod(a) (a>0?a:-a)
#define pf printf
#define sf scanf

using namespace std;

struct DATA{
    int r, c;
    void set(int i, int j)
    {
        r = i;
        c = j;
    }
};



ll dp[101][501][2][2];
ll cost[101][501];
DATA path[101][501];
int rows, columns;

ll rec(int r, int c, bool leftused, bool rightused)
{
    ll &ret = dp[r][c][leftused][rightused];
    if(ret != -1) return ret;
    if(r == rows-1) return ret = cost[r][c];

    ret = rec(r+1, c, 0, 0);

    if(leftused == 0 && rightused == 0)
        path[r][c].set(r+1, c);

    if(rightused == 0 && c+1 < columns )
    {
        if(rec(r, c+1, 1, 0) < ret)
        {
            ret = dp[r][c+1][1][0];
            if(leftused == 0)
                path[r][c].set(r, c+1);
        }
    }

    if(leftused == 0 && 0 < c )
    {
        if(rec(r, c-1, 0, 1 ) < ret )
        {
            ret = dp[r][c-1][0][1];
            if(rightused == 0)
                path[r][c].set(r, c-1);
        }
    }


    ret += cost[r][c];

    return ret;

}



int main()
{

    ll mincost;
    mem(dp, -1);
    mem(path, -1);
    cin>>rows>>columns;

    loop(i, rows)
    {
        loop(j, columns)
        {
            cin>>cost[i][j];
        }
    }

    mincost = INF;
    DATA start;
    start.r = 0;
    loop(i, columns)
    {
        if(rec(0, i, 0, 0) < mincost)
        {
            start.c = i;
            mincost =   dp[0][i][0][0];
        }
    }



    while(start.r != rows-1)
    {
        cout<<start.c+1<<" ";
        start.set(path[start.r][start.c].r, path[start.r][start.c].c);
    }
    cout<<start.c + 1<<endl;


    return 0;
}


(UVa) 437 – The Tower of Babylon

0
/*
user: php
time: 0.016 sec
link: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=378
*/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>

#include<algorithm>
#include<vector>
#include<string>
#include<stack>
#include<queue>
#include<map>
#include<sstream>



#define FOR(i, s, e) for(int i=s; i<e; i++)
#define loop(i, n) for(int i=0; i<n; i++)
#define getint(n) scanf("%d", &n)
#define pb(a) push_back(a)
#define ll long long
#define SZ size()
#define read() freopen("input.txt", "r", stdin)
#define write() freopen("output.txt", "w", stdout)
#define mem(a, v) memset(a, v, sizeof(a))
#define all(v) v.begin(), v.end()
#define pi acos(-1.0)
#define INF 1<<29
#define mod(a) (a>0?a:-a)

#define MAXX 187

using namespace std;

struct DATA{
    int sides[3];
    void get(int i, int j, int k)
    {
        sides[2] = i;
        sides[1] = j;
        sides[0] = k;

    }


};

DATA box[MAXX];
int dp[MAXX];
int len;



bool comp(DATA a, DATA b)
{
    return a.sides[0] < b.sides[0];
}


bool fcomp(DATA a, DATA b)
{
    return a.sides[0] < b.sides[0] && a.sides[1] < b.sides[1];
}




int longest(int u)
{
    int &ret = dp[u];
    if(ret != -1) return ret;

    ret = 0;

    for(int v=u+1; v<len; v++)
    {
        if( fcomp(box[u], box[v]) )
        {
            ret = max(ret, longest(v) );
        }
    }

    ret += box[u].sides[2];
    return ret;

}














int main()
{
    //read();
    int number_of_boxes;
    int ss[3];
    int j;
    int result;
    int kaseno = 0;

    while(true)
    {
        getint(number_of_boxes);
        if(number_of_boxes == 0) break;

        loop(i, number_of_boxes)
        {
            getint(ss[0]); getint(ss[1]); getint(ss[2]);




            j = 6*i;

            box[j].get(ss[0], ss[1], ss[2]);

            box[j+1].get(ss[0], ss[2], ss[1]);

            box[j+2].get(ss[1], ss[0], ss[2]);

            box[j+3].get(ss[2], ss[0], ss[1]);

            box[j+4].get(ss[1], ss[2], ss[0]);

            box[j+5].get(ss[2], ss[1], ss[0]);





        }


        len = number_of_boxes * 6;

        sort(box, box + len, comp );

        mem(dp, -1);

        result = -INF;

        loop(i, len)
        {
            result = max(result, longest(i) );
        }

        printf("Case %d: maximum height = %d\n", ++kaseno, result);
    }

    return 0;
}




(UVa) 255 – Correct Move

0
/*
user: php
time: 0.052 sec
link: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=191
*/

#include<iostream>
#include<cstdio>
using namespace std;




int mod(int i)
{
    if(i<0) return -i;
    return i;
}


struct position{
    int x, y;

    void set(int state)
    {
        x = state % 8;
        y = state / 8;
    }


};





int main()
{
    position king, queen, next;
    int p, q, r;
    while(scanf("%d %d %d", &p, &q, &r) == 3)
    {
        if(p == q)
        {
            printf("Illegal state\n");
        }
        else
        {
            if(q == r)
            {
                printf("Illegal move\n");
                continue;
            }

            king.set(p);
            queen.set(q);
            next.set(r);

            if(queen.x == next.x )
            {

                if( (king.x == next.x) && ( ( next.y <= king.y && king.y < queen.y) || (queen.y < king.y && king.y <= next.y) )  )
                {
                    printf("Illegal move\n");
                    continue;
                }
            }
            else if(queen.y == next.y)
            {
                if( (king.y == next.y) && ( ( next.x <= king.x && king.x < queen.x) || (queen.x < king.x && king.x <= next.x) ) )
                {
                    printf("Illegal move\n");
                    continue;
                }
            }
            else
            {
                printf("Illegal move\n");
                continue;
            }

            if(mod(king.x - next.x) + mod(king.y - next.y) == 1)
            {
                printf("Move not allowed\n");
            }
            else
            {
                if(mod(king.x - next.x)== 1 && mod(king.y - next.y) == 1 &&   ((king.x == 0 &&(king.y = 0 || king.y == 7)) || (king.x == 7 &&(king.y == 0 || king.y == 7)))   )
                {
                    printf("Stop\n");
                }
                else
                {
                    printf("Continue\n");
                }
            }
        }
    }
    return 0;

}


(UVa) 11331 – The Joys of Farming

0
/*
user: php
time: 0.084 sec
link: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=2306
*/

#include<iostream>
#include<vector>
#include<cstring>
#include<cstdio>

#include<map>

#define loop(i, n) for(int i=0; i<n; i++)
#define pb push_back
#define ms(array, value) memset(array, value, sizeof(array))
#define MAXX 2002
#define getint(a) scanf("%d", &a)
#define SZ size()

using namespace std;




struct PAIR{
    int first, second;
    void mp(int i, int j)
    {
        first = i;
        second = j;
    }
};


PAIR point;

vector<int> Graph[MAXX];
vector<int> v[2];
vector<PAIR> pointlist;


bool visited[MAXX];




bool bfs(int node)
{
    if(Graph[node].SZ == 0)
    {
        point.mp(1, 0);
        pointlist.pb(point);
        return false;

    }

    bool visitedByBC[2][MAXX];
    loop(i, 2)
    {
        loop(j, MAXX)
        {
            visitedByBC[i][j] = false;
        }
    }

    loop(i, MAXX) visited[i] = false;

    v[0].clear();
    v[1].clear();
    bool cIndex = 0;
    int p, q;
    int *target;
    point.mp(1, 0);
    target = &point.second;

    v[cIndex].pb(node);
    visited[node] = true;
    visitedByBC[cIndex][node] = true;


    while(v[cIndex].SZ)
    {
        int len = v[cIndex].SZ;
        int len2;

        loop(i, len)
        {
            p = v[cIndex][i];
            len2 = Graph[p].SZ;
            loop(j, len2)
            {
                q = Graph[p][j];
                if( ! visited[q] )
                {

                    visited[q] = true;
                    visitedByBC[!cIndex][q] = true;

                    (*target)++;
                    v[!cIndex].pb(q);
                }
                else
                {
                    if(visitedByBC[cIndex][q])
                    {
                        return true;
                        break;
                    }
                }
            }
        }
        v[cIndex].clear();
        if(cIndex == 0)
        {
            cIndex = 1;
            target = &point.first;
        }
        else
        {
            cIndex = 0;
            target = &point.second;
        }
    }


    pointlist.pb(point);

    return false;


}


bool dp[MAXX][MAXX];

bool coloring(int p, int target)
{
    if(target == 0 && p == pointlist.size())
    {
        return true;
    }
    if(target < 0) return false;
    if(p == pointlist.size()) return false;


    if(dp[p][target] == false) return false;

    return dp[p][target] = coloring(p+1, target-pointlist[p].first) || coloring(p+1, target - pointlist[p].second);



}






using namespace std;
int main()
{
    bool done;
    int kases, u, v;
    int b, c, a;
    cin>>kases;

    while(kases--)
    {
        done = false;
        loop(i, MAXX)
        {
             Graph[i].clear();
             visited[i] = false;
             loop(j, MAXX)
             {
                 dp[i][j] = true;
             }
        }
        pointlist.clear();

        getint(b);
        getint(c);
        getint(a);

        loop(i, a)
        {
            getint(u);
            getint(v);
            Graph[u].pb(v);
            Graph[v].pb(u);

        }


        int len = b + c + 1;

        for(int i=1; i<len; i++)
        {
            if(!visited[i])
            if(bfs(i))
            {
                printf("no\n");
                done = true;
                break;
            }

        }

        if(done) continue;
        if(coloring(0, b))
        {
            printf("yes\n");
        }
        else
        {
            printf("no\n");
        }
    }

    return 0;



}