Pagini recente » Cod sursa (job #268175) | Cod sursa (job #1494449) | Cod sursa (job #30804) | Cod sursa (job #1793084) | Cod sursa (job #991053)
Cod sursa(job #991053)
#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();
}