Cod sursa(job #371385)

Utilizator victor.ionescuIonescu Victor Cristian victor.ionescu Data 5 decembrie 2009 03:35:25
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;
struct box{ int x,y,z,dyn; } boxes[3600];
int N,T,aib[3600][3600];
vector<int> Q;
char S[100];

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) {
                fgets(S+1,99,stdin);
                boxes[i].x=0;
                int indice=1;
                while (S[indice]>='0' && S[indice]<='9') { boxes[i].x*=10;boxes[i].x+=S[indice]-'0'; ++indice; }
                boxes[i].y=0;
                ++indice;
                while (S[indice]>='0' && S[indice]<='9') { boxes[i].y*=10;boxes[i].y+=S[indice]-'0'; ++indice; }
                boxes[i].z=0;
                ++indice;
                while (S[indice]>='0' && S[indice]<='9') { boxes[i].z*=10;boxes[i].z+=S[indice]-'0'; ++indice; }
        }
	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();
	printf("%d\n",query_aib(N,N));
}

int main(){
        freopen("cutii.in","rt",stdin);
        freopen("cutii.out","wt",stdout);
        scanf("%d%d\n",&N,&T);
	for (int i=1;i<=T;++i) test_case();
	fclose(stdin);fclose(stdout);
	return 0;
}