Cod sursa(job #1799471)

Utilizator Kln1000Ciobanu Bogdan Kln1000 Data 6 noiembrie 2016 13:20:16
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <cstring>

using namespace std;

ifstream f ("cutii.in");
ofstream t ("cutii.out");

struct cutii{
int x;
int y;
int z;};

int n,q[100010];
volatile int nr,nr_aux;
vector <cutii> v;
cutii aux[100010];

int bin_search_y(cutii target)
{
    int st=1,dr=nr;
    while(st<=dr)
    {
        int mid=(st+dr)>>1;
        if(target.y<=v[q[mid]].y) dr=mid-1;
        else st=mid+1;
    }
    return st;
}

int bin_search_z(cutii target)
{
    int st=1,dr=nr_aux;
    while(st<=dr)
    {
        int mid=(st+dr)>>1;
        if(target.z>=aux[q[mid]].z) dr=mid-1;
        else st=mid+1;
    }
    return st;
}

void scmax_y(){
    memset(q,0,sizeof(q));
    int d[100010],tata[100010];
    for(int i=1;i<=n;++i){
        int pos=bin_search_y(v[i]);
        if(pos>nr) ++nr;
        q[pos]=i;
        d[i]=d[q[pos-1]]+1;
        tata[i]=q[pos-1];
    }
    int max=0,pos;nr=0;
    for(int i=1;i<=n;++i)
        if(d[i]>max) max=d[i],pos=i;
    for(int i=pos;i>0;i=tata[i])
        aux[++nr]=v[i];
}

void scmax_z(){
    memset(q,0,sizeof(q));
    int d[100010],tata[100010];
    for(int i=1;i<=nr;++i){
        int pos=bin_search_z(aux[i]);
        if(pos>nr_aux) ++nr_aux;
        q[pos]=i;
        d[i]=d[q[pos-1]]+1;
        tata[i]=q[pos-1];
    }
    int max=0,pos;nr_aux=0;
    for(int i=1;i<=nr;++i)
        if(d[i]>max) max=d[i],pos=i;
    for(int i=pos;i>0;i=tata[i])
        ++nr_aux;
    t<<nr_aux<<'\n';
}

void citire(){
    int queries;
    f>>n>>queries;
    v.resize(n+1);
    for (int i=0;i<queries;++i){
        for (int j=1;j<=n;++j)
            f>>v[j].x>>v[j].y>>v[j].z;
    sort(v.begin()+1,v.end(),[](const cutii & a ,const cutii & b){return a.x < b.x;});
    nr=nr_aux=0;
    scmax_y();
    scmax_z();
    }
}

int main()
{
    citire();
    return 0;
}