Cod sursa(job #371384)

Utilizator victor.ionescuIonescu Victor Cristian victor.ionescu Data 5 decembrie 2009 03:23:13
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;
ifstream fi("cutii.in");
ofstream fo("cutii.out");
struct box{ int x,y,z,dyn; } boxes[3600];
int N,T,aib[3600][3600];
vector<int> Q;

inline bool cmp(const box &A,const box &B){ return A.x<B.x; }

inline int bit(int x){
	return (x&(x-1))^x;
}

int query_aib(int i,int j){
	int sum=0;
	for (;i;i-=bit(i))
		for (int y=j;y;y-=bit(y))
			sum=max(sum,aib[i][y]);
	return sum;
}

void update_aib(int i,int j,int s){
	for (;i<=N;i+=bit(i))
		for (int y=j;y<=N;y+=bit(y))
			aib[i][y]=max(aib[i][y],s);
}

void test_case(){
	memset(aib,0,sizeof(aib));
	for (int i=1;i<=N;++i) fi>>boxes[i].x>>boxes[i].y>>boxes[i].z;
	sort(boxes+1,boxes+N+1,cmp);
	for (int i=1;i<=N;++i){
		if (i>1 && boxes[i].x>boxes[i-1].x){
			for (unsigned int j=0;j<Q.size();++j)
				update_aib(boxes[Q[j]].y,boxes[Q[j]].x,boxes[Q[j]].dyn);
			Q.clear();
		}
		boxes[i].dyn=query_aib(boxes[i].y-1,boxes[i].z-1)+1;
		Q.push_back(i);
	}
        for (unsigned int i=0;i<Q.size();++i) update_aib(boxes[Q[i]].x,boxes[Q[i]].y,boxes[Q[i]].dyn);
        Q.clear();
	fo<<query_aib(N,N)<<"\n";
}

int main(){
	fi>>N>>T;
	for (int i=1;i<=T;++i) test_case();
	fi.close();fo.close();
	return 0;
}