Cod sursa(job #991053)

Utilizator Cosmin1490Balan Radu Cosmin Cosmin1490 Data 29 august 2013 16:42:55
Problema Cutii Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.52 kb
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <fstream>
using namespace std;

const string file = "cutii";

const string infile = file + ".in";
const string outfile = file + ".out";

const int INF = 0x3f3f3f3f;

int N, T;

struct Cutie
{
	int x;
	int y;
	int z;

	Cutie(int x = 0, int y = 0, int z = 0)
	{
		this->x = x;
		this->y = y;
		this->z = z;
	}

	bool operator < (const Cutie& other) const
	{
		return this->z < other.z;
	}
};

vector<Cutie> cutii;

class Aib2DMax
{
public:
	static int zeros(int x);
	Aib2DMax(int maxI, int maxJ);
	void Reset();
	void Update(int i, int j, int val);
	int Query(int i, int j);
protected:
private:
	int _maxI;
	int _maxJ;
	vector<vector<int> > _data;
};

int Aib2DMax::zeros(int x)
{
	return (x ^ (x - 1)) & x;
}


Aib2DMax::Aib2DMax(int maxI, int maxJ)
{
	this->_maxI = maxI;
	this->_maxJ = maxJ;

	this->_data.resize(_maxI + 1, vector<int>(_maxJ + 1, 0));
}

void Aib2DMax::Reset()
{
	for(int i = 0; i <= _maxI; i++)
	{
		for(int j = 0; j <= _maxJ; j++)
		{
			this->_data[i][j] = 0;
		}
	}
}

void Aib2DMax::Update(int i, int j, int value)
{
	for(int x = i; x <= _maxI; x += zeros(x))
	{
		for(int y = j; y <= _maxJ; y += zeros(y))
		{
			_data[x][y] = max(_data[x][y], value);
		}
	}
}

int Aib2DMax::Query(int i, int j)
{
	int maxi = 0;
	for(int x = i; x > 0; x -= zeros(x))
	{
		for(int y = j; y > 0; y -= zeros(y))
		{
			maxi = max(maxi, _data[x][y]);
		}
	}
	return maxi;
}

int main()
{
	fstream fout(outfile.c_str(), ios::out);
	fstream fin(infile.c_str(), ios::in);
	fin >> N >> T;

	Aib2DMax aib(N, N);
	cutii.resize(N + 1);

	for(int i = 0; i < T; i++)
	{
		for(int j = 1; j <= N; j++)
		{
			int x, y, z;
			fin >> x >> y >> z;
			cutii[j] = Cutie(x, y, z);
		}

		int sol = 0;
		sort(cutii.begin() + 1, cutii.end());
		aib.Reset();

		for(int i = 1; i <= N; i++)
		{
			int c = aib.Query(cutii[i].x - 1, cutii[i].y - 1) + 1;
			aib.Update(cutii[i].x, cutii[i].y, c);
			sol = max(sol, c);
		}

		fout << sol << "\n";
	}


	fin.close();
	fout.close();
}