Pagini recente » Cod sursa (job #2401161) | Cod sursa (job #1981808) | Cod sursa (job #1335040) | Cod sursa (job #1799679) | Cod sursa (job #371385)
Cod sursa(job #371385)
#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;
}