Cod sursa(job #794853)

Utilizator mipsPavel Mircea mips Data 7 octombrie 2012 11:27:53
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.46 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <deque>
#include <cstdio>
#include <algorithm>
using namespace std;
//ifstream fin("cutii.in");
ofstream fout("cutii.out");
vector<int> adj[4000];

vector< pair< int , pair< int , int> > > cutii;

int cost[4000];
bool finished[4000];
int t;
int n;
int tree[4000][4000];



int query(int x, int y) {
        //fout << "cer:" << x << ","  << y<<endl;
        int sum = 0;
        for (int a=x; a >= 0; a = (a & (a + 1)) - 1)
        for (int b=y; b >= 0; b = (b & (b + 1)) - 1)
          sum = max(sum,tree[a][b]);

        //fout << "da:" << sum<<endl;
        return sum;
    }



// Increases value of k-th element by inc.
void set(int x, int y, int maxim) {
    //fout << "bag:" << x << ","  << y <<":"<<maxim<<endl;
    for (int k = x; k <= n; k |= k + 1)
    {
        for (int kk=y; kk <= n; kk |= kk + 1)
            tree[k][kk]= max(maxim, tree[k][kk] );
    }
}

void unset(int x, int y) {
    //cout << "pe 0 :" << x << ","  << y <<endl;
    for (int k = x; k <= n; k |= k + 1)
    {
        for (int kk=y; kk <= n; kk |= kk + 1)
            tree[k][kk]=0;
    }
}

int main()
{
    // gen
/*
    ofstream finout("cutii.in");
    finout << 3500 << " " <<100<<endl;
    for (int i=0;i<100;i++)
    for (int j=0;j<3500;j++)
    {
        finout << j/5 << " " << j%5 << " " << j<<endl;
    }
    finout.close();
*/
    ifstream fin("cutii.in");

    fin >> n >> t;
    n++;

    for (int tests=0; tests<t; tests++)
    {
        cutii.clear();
        for (int i=0; i<n; i++)
        {
            int a,b,c;
            fin >> a >> b >> c;
            cutii.push_back( make_pair(a,make_pair(b,c)) );
        }

        sort(cutii.begin(),cutii.end());
        int maximal =0;
        int lastRem=0;
        for (int i=0; i<n; i++)
        {
            if (i!=0)
            if (cutii[i].first != cutii[i-1].first)
            {
                for (int j=lastRem;j<i;j++)
                {
                    // set efectiv
                    set(cutii[j].second.first , cutii[j].second.second,query(cutii[j].second.first-1,cutii[j].second.second-1)+1);
                }
                lastRem=i;
            }

            maximal = query(cutii[i].second.first-1,cutii[i].second.second-1);
            //cout << "gasit:" << query(cutii[i].second.first-1,cutii[i].second.second-1)<<endl;

        }

        for (int i=0; i<n; i++)
            unset(cutii[i].second.first,cutii[i].second.second);
        fout << maximal+1<<endl;

    }


}