(UVa) 11267 The Hire-a-Coder Business Model

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

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

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



#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 dd double
#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
#define mp make_pair
#define paii pair<int, int>
#define padd pair<dd, dd>
#define pall pair<ll, ll>
#define fr first
#define sc second

using namespace std;

#define MAXX 11002

vector<int>graph[MAXX];
vector< pair<int, pair<int, int> > >edges;
char color[MAXX];
int cntNodes, cntEdges;
bool possible;
int parent[MAXX];

void bfs()
{
    color[1] = 0;
    queue<int>Q;
    Q.push(1);

    int u, v;
    while( !Q.empty() )
    {
        u = Q.front(); Q.pop();
        loop(i, SZ(graph[u]))
        {
            v = graph[u][i];
            if(color[v] == color[u])
            {
                possible = false;
                return;
            }
            if(color[v] == -1)
            {
                color[v] = color[u]?0:1;
                Q.push(v);
            }

        }
    }
}


int find(int u)
{
    if(parent[u] == u)
    {
        return u;
    }
    else return parent[u] = find(parent[u]);
}



int main()
{
    int p, q, w;
    while(1)
    {
        getint(cntNodes);
        if(!cntNodes) break;


        for(int i=1; i<=cntNodes; i++)
        {
            graph[i].clear();
        }
        edges.clear();

        getint(cntEdges);

        loop(i, cntEdges)
        {
            getint(p); getint(q); getint(w);
            graph[p].pb(q);
            graph[q].pb(p);
            edges.pb( mp(w, mp(p, q)));
        }

        mem(color, -1);
        possible = 1;

        bfs();

        if(!possible)
        {
            pf("Invalid data, Idiot!\n");
        }
        else
        {
            for(int i=1; i<=cntNodes; i++) parent[i] = i;
            ll minCost = 0;
            sort(all(edges));
            loop(i, SZ(edges))
            {
                p = find(edges[i].sc.fr);
                q = find(edges[i].sc.sc);
                w = edges[i].fr;

                if(p != q || w < 0)
                {
                    minCost += w;
                    parent[p] = q;
                }
            }
            pf("%lld\n", minCost);
        }

    }

    return 0;
}


(UVa) 10034 Freckles

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

#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
#define pdd pair<double, double>
#define fr first
#define sc second
#define mp make_pair

using namespace std;

#define MAXX 102

int cntPoints;
pdd points[MAXX];
int parent[MAXX];

template<typename T>
T sqr(T a)
{
    return a*a;
}

int find(int u)
{
    if(parent[u] == u)
    {
        return u;
    }
    return parent[u] = find(parent[u]);
}







int main()
{
    int kases;
    getint(kases);
    double p, q;
    double minCost;
    bool blank = false;

    while(kases--)
    {
        getint(cntPoints);
        loop(i, cntPoints)
        {
            sf("%lf %lf", &p, &q);
            points[i] = mp(p, q);
        }



        vector<pair<double, pair<int, int> > > dists;

        loop(i, cntPoints)
        {
            FOR(j, i+1, cntPoints)
            {
                dists.pb(  mp(  sqrt( sqr(points[i].fr - points[j].fr) + sqr(points[i].sc - points[j].sc)  ) , mp(i, j)   )    );
            }
        }

        sort(all(dists));
        loop(i, cntPoints)
        {
            parent[i] = i;
        }

        minCost = 0;
        int u, v;

        loop(i, SZ(dists))
        {
            u = find(dists[i].sc.fr);
            v = find(dists[i].sc.sc);

            if(u != v)
            {
                parent[u] = v;
                minCost += dists[i].fr;
            }
        }

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

        pf("%.2lf\n", minCost);




    }


    return 0;
}

(UVa) 514 Rails

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

#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;

#define MAXX 1002


int cntCells;


int main()
{
    int id;

    while(getint(cntCells) && cntCells!= 0)
    {

        while(getint(id) && id != 0)
        {


            if(!id) break;

            queue<int>B;


            B.push(id);


            FOR(i, 1, cntCells)
            {
                getint(id);
                B.push(id);
            }

            int pos = 1;

            stack<int>station;

            while( !B.empty()  )
            {
                while(station.empty() || station.top() !=B.front() )
                {
                    if(pos > cntCells) break;
                    station.push(pos);
                    pos++;
                }

                if(station.top() == B.front() )
                {
                    station.pop();
                    B.pop();
                }
                else
                {
                    break;
                }
            }

            if(B.empty())
            {
                pf("Yes\n");
            }
            else
            {
                pf("No\n");
            }
        }
        pf("\n");






    }


    return 0;
}

(UVa) 146 – ID Codes

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

#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 main()
{
    string ss;
    while(true)
    {
        cin>>ss;
        if(ss == "#") break;
        if( !next_permutation(all(ss)))
        {
            pf("No Successor\n");
        }
        else
        {
            cout<<ss<<endl;
        }
    }

    return 0;
}






(UVa) 558 – Wormholes

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

#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;

#define MAXX 2002

struct DATA{
    int p, q, w;
};


int stars, countPaths;
DATA paths[MAXX];
ll dist[MAXX];

bool bellmanFord()
{
    loop(i, stars)
    {
        dist[i] = INF;
    }

    dist[1] = 0;

    loop(i, stars-1)
    {
        loop(j, countPaths)
        {
            if( dist[ paths[j].p ] + paths[j].w < dist[ paths[j].q ]  )
            {
                dist[ paths[j].q ] = dist[ paths[j].p ] + paths[j].w;
            }
        }
    }

    loop(j, countPaths)
    {
        if( dist[ paths[j].p ] + paths[j].w < dist[ paths[j].q ]  )
        {
            return false;
        }
    }
    return true;
}








int main()
{
    int kases;
    getint(kases);
    int p, q, w;
    while(kases--)
    {
        getint(stars); getint(countPaths);
        loop(i, countPaths)
        {
            getint(paths[i].p); getint(paths[i].q); getint(paths[i].w);
        }

        if(!bellmanFord())
        {
            pf("possible\n");
        }
        else
        {
            pf("not possible\n");
        }


    }

    return 0;
}






(timus) 1078. Segments

0
/*
link: http://acm.timus.ru/problem.aspx?space=1&num=1078
*/

#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
#define MAXX 22

#define MAXX 10002

using namespace std;

struct DATA{

    int id, left, right;
};

bool comp(DATA a, DATA b)
{
    if(a.left < b.left)
    {
        return true;
    }
    else if(a.left == b.left)
    {
        return a.right < b.right;
    }
    else
    {
        return false;
    }
}


int cnt;

DATA ara[MAXX];

int LisLen = 0;
int L[MAXX];

void NlogK()
{
    int temp = cnt+1;
    int I[temp];
    I[0] = INF;

    FOR(i, 1, temp)
    {
        I[i] = -INF;
    }

    int left, u, right, mid;

    loop(i, cnt)
    {
        u = ara[i].right;
        left = 0;
        right = LisLen;


        while( left <= right )
        {
            mid = (left + right)/2;

            if(I[mid] > u)
            {
                left = mid+1;
            }
            else
            {
                right = mid - 1;
            }
        }

        I[left] = u;
        L[i] = left;

        LisLen = max(LisLen, left);
    }


}











int main()
{
    getint(cnt);

    loop(i, cnt)
    {
        ara[i].id = i;
        getint(ara[i].left); getint(ara[i].right);
    }

    sort(ara, ara+cnt, comp);

    NlogK();

    cout<<LisLen<<endl;

    int last_taken = -INF;


    for(int i=cnt-1; i>-1; i--)
    {
        if(L[i] == LisLen && ara[i].right > last_taken)
        {
            pf("%d", ara[i].id + 1);
            LisLen--;
            if(LisLen) pf(" ");
        }
    }
    pf("\n");






}

(timus) 1073. Square Country

0
/*
link: http://acm.timus.ru/problem.aspx?space=1&num=1073
*/

#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 1000000
#define mod abs
#define pf printf
#define sf scanf

#define MAXX 60002

using namespace std;

int dp[MAXX];
int rec(int remain)
{
    int &ret = dp[remain];
    if(ret != -1) return ret;

    int root = sqrt(remain);

    ret = INF;

    for(int i=1; i<=root; i++)
    {
        ret = min(ret, rec(remain - i*i));
    }
    return ++ret;
}

using namespace std;

int main()
{
    int target;
    getint(target);
    mem(dp, -1);
    dp[0] = 0;

    cout<<rec(target)<<endl;

}

(UVa) 208 – Firetruck

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

#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 abs
#define pf printf
#define sf scanf
#define MAXX 22


using namespace std;
int target;

vector<int>graph[MAXX];
int result[MAXX];
bool done[MAXX];
int cnt;


void rec(int pos)
{
    if(result[pos] == target)
    {
        cnt++;
        pf("1");
        pos++;
        FOR(i, 1, pos)
        {
            pf(" %d", result[i]);
        }
        pf("\n");
        return;
    }



    int u = result[pos];
    int len = SZ(graph[u]);
    pos++;
    int v;
    loop(i, len)
    {
        v = graph[u][i];
        if(!done[v])
        {
            result[pos] = v;
            done[v] = true;
            rec(pos);
            done[v] = false;
        }
    }


}





bool bfs(int u)
{
    bool visited[MAXX];
    mem(visited, 0);

    visited[1] = true;
    queue<int>Q;
    Q.push(u);
    while( !Q.empty() )
    {
        int u = Q.front(); Q.pop();
        int len = SZ(graph[u]);
        loop(i, len)
        {
            int v = graph[u][i];
            if(v == target)
            {
                return true;
            }
            if(!visited[v])
            {
                visited[v] = true;
                Q.push(v);
            }
        }
    }
    return false;

}

int main()
{
    int kaseno = 0;
    int p, q;
    while(getint(target) == 1)
    {
        loop(i, MAXX)
        {
            graph[i].clear();
        }
        while(true)
        {
            getint(p); getint(q);
            if(p == 0 && q == 0) break;

            graph[p].pb(q);
            graph[q].pb(p);
        }
        pf("CASE %d:\n", ++kaseno);

        if(bfs(1) == 0)
        {
            pf("There are 0 routes from the firestation to streetcorner %d.\n", target);
        }
        else
        {
            cnt = 0;
            loop(i, MAXX)
            {
                sort(all(graph[i]));
            }

            mem(done, 0);
            done[1] = true;
            result[0] = 1;
            rec(0);
            pf("There are %d routes from the firestation to streetcorner %d.\n", cnt, target);
        }



    }

    return 0;
}

(lightoj) 1164 – Horrible Queries

0
/*
link: http://lightoj.com/volume_showproblem.php?problem=1164
*/

#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 abs
#define pf printf
#define sf scanf

using namespace std;


#define MAXX 100002

ll sum[4*MAXX];
int lazy[4*MAXX];



void updateNode(int idx, int st, int ed, int value)
{
    sum[idx] += value * (ed - st + 1);
    lazy[idx] += value;
}




void update(int idx, int st, int ed, int i, int j, int value)
{
    if(st == i && ed == j)
    {
        sum[idx] += value * (ed - st + 1);
        lazy[idx] += value;
        return;
    }



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

    if(lazy[idx] > 0)
    {
        updateNode(l, st, mid, lazy[idx]);
        updateNode(r, mid+1, ed, lazy[idx]);
    }
    lazy[idx] = 0;


    if(j<=mid)
    {
        update(l, st, mid, i, j, value);
    }
    else if(mid < i)
    {
        update(r, mid+1, ed, i, j, value );
    }
    else
    {
        update(l, st, mid, i, mid, value);
        update(r, mid+1, ed, mid+1, j, value);
    }

    sum[idx] = sum[l] + sum[r];



}

ll query(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)>>1;

    if(lazy[idx] > 0)
    {
        updateNode(l, st, mid, lazy[idx]);
        updateNode(r, mid+1, ed, lazy[idx]);
    }
    lazy[idx] = 0;

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






int main()
{
    //read();
    //write();
    int kases, kaseno = 0;
    getint(kases);
    int cmd, x, y, v;

    int elements, cnt_query;

    while(kases--)
    {
        pf("Case %d:\n", ++kaseno);
        getint(elements);
        getint(cnt_query);

        mem(sum, 0);
        mem(lazy, 0);

        loop(t, cnt_query)
        {
            sf("%d%d%d", &cmd, &x, &y);
            x++;
            y++;
            if(cmd == 0)
            {
                getint(v);
                update(1, 1, elements, x, y, v);
            }
            else
            {
                pf("%lld\n", query(1, 1, elements, x, y));
            }
        }

    }

}

(lightoj) 1087 – Diablo

0
/*
link: http://lightoj.com/volume_showproblem.php?problem=1087
*/

#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 abs
#define pf printf
#define sf scanf

using namespace std;

#define MAXX 150005

int cnt_elements[4*MAXX];
vector<int>ids;
int cnt;
int cnt_query;
int total;


void update(int idx, int st, int ed, int pos, int value)
{
    //cout<<"calling with "<<idx<<" and start = "<<st<<" and end ="<<ed<<"and pos = "<<pos<<endl;
    if(st == pos && pos == ed)
    {
        cnt_elements[idx] += value;
        return;
    }


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

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

    cnt_elements[idx] = cnt_elements[l] + cnt_elements[r];
}


int get(int idx, int st, int ed, int pos)
{
    //cout<<"calling with "<<idx<<" and start = "<<st<<" and end ="<<ed<<"and pos = "<<pos<<" and number of elements = "<<cnt_elements[idx]<<endl;

    cnt_elements[idx]--;
    if(st == ed  )
    {
        return st;
    }

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

    if( pos <= cnt_elements[l] )
    {
        return get(l, st, mid, pos);
    }
    else
    {
        return get(r, mid +1, ed, pos - cnt_elements[l]);
    }
}





int main()
{
    //read();
    //write();
    int kases, kaseno = 0;
    getint(kases);
    int num;
    char cmd[4];
    int id;
    int temp;

    while(kases--)
    {
        pf("Case %d:\n", ++kaseno);
        getint(cnt); getint(cnt_query);
        total = cnt + cnt_query;
        temp = cnt;
        mem(cnt_elements, 0);
        ids.clear();

        loop(i, cnt)
        {
            getint(num);
            ids.pb(num);
            update(1, 1, total, i+1, 1);
        }



        loop(t, cnt_query)
        {
            sf("%s", cmd);
            getint(num);


            if(cmd[0] == 'c')
            {


                if(num > cnt)
                {
                    pf("none\n");
                    continue;
                }

                cnt--;

                id = get(1,1, total, num);
                pf("%d\n", ids[id-1]);
            }
            else
            {
                ids.pb(num);
                temp++;
                cnt++;
                update(1, 1, total, temp, 1);

            }
        }



    }

    return 0;
}