Spis treści

AISD: pracownia D

Wyniki

http://www.ii.uni.wroc.pl/~mbi/dyd/aisd_11s/wyniki_D.html - wyniki
1-sza kolumna to suma czasów z testów 1-10
0 oznacza nieprzejście jakiegoś testu 1-10.

2032:   Paw Garn
2448:   Łuk Gnia
2644:   Pio Olma
3588:   Mar Sado
4288:   Pio Pole
4356:   Dan Błas
4364:   Paw Bogd
4384:   Kam Sobe
4708:   Ada Błas
4896:   Prz Past
4940:   Adr Mula
5004:   Mat Sier
5032:   Ram Huae (test)
5052:   Jan Marc
5084:   Mar Nied
5156:   Mat Lewa
5248:   Mat Kubi
5328:   Mac Maty
5700:   Łuk Synó
6064:   Tad Dul (test)
6216:   Jak Tarn
6284:   Mic Róża
6780:   Ale Szym
7096:   Mar Pawł
7896:   Pio Sobc (test)
7912:   Pio Sobc
10436:  Mac Kupi
10556:  Pio Krze
10928:  Grz Łoś
11468:  Kar Kona
12924:  Jan Walc
14036:  Mar Pole
15708:  Tad Dul
15976:  Mar Wier
16024:  Mat Buja
16040:  Mat Karw
16060:  Paw Schm
16132:  Raf Sław
16304:  Mar Kusy
16328:  Krz Kusi
16368:  Jak Stęp
16496:  Mar Wier (test)
17392:  Art Kras
17564:  Krz Piep
17572:  Mic Koło
17876:  Ewe Grot
19236:  Kam Wold
19668:  Dor Prze
19896:  Rob Miel
20432:  Ada Kuny
27988:  Pio Pole (test)
0:      Mar Zwon
0:      Kon Wypy
0:      Kar Woźn (test)
0:      Kar Woźn
0:      Mat Wójc
0:      Mac Wiec
0:      Dam Wiec
0:      Wer Świd
0:      Dor Such
0:      Kat Stre
0:      Paw Sobi
0:      Mar Siel
0:      Mic Rych
0:      Pio Popo
0:      Dam Piąt
0:      Cel Pawl
0:      Agn Olsz
0:      Pio Olch
0:      Aro Mojs
0:      Tom Miku
0:      Tom Macz
0:      Raf Maćk
0:      Łuk Lamp
0:      Mar Kusy (test)
0:      Mic Kras (test)
0:      Woj Kowa
0:      Mac Kena
0:      Mar Kacz
0:      Krz Hein
0:      Agn Góra
0:      Mic Głow
0:      Mik Garb
0:      Kat Form
0:      Mic Flen
0:      Daw Drza
0:      Jak Ceck

Rozwiązanie (cinkowskiw)

Przeszło wszystkie testy. Zrobione na drzewach przedziałowych.

#include <cstdio>
#include <iostream>
#include <stdlib.h>
#include <string.h>
 
using namespace std;
const int M = 524288;
int i,  pozycja = 0, rozmiar = 0, znak, T, Ai, raw[M], sequence[M], starting[M], ending[M], tab[2*M], longest;
char buf[1000];
 
#define get_char(znak){if(rozmiar>pozycja)znak=buf[pozycja++];else{if(feof(stdin))znak=0;else{rozmiar=fread(buf,1,1000,stdin);znak=buf[0];pozycja=1;}}}
#define get_int(zm){zm=0;get_char(znak);while(znak!='\n'&&znak!=' '){zm=znak+10*zm-48;get_char(znak);}}
 
void insert(int element, int length) {
  int v = M + element;
  tab[v] = max(tab[v], length);
  while(v > 1) {
    v /= 2;
    tab[v] = max(tab[2 * v], tab[2 * v + 1]);
  }
}
 
int query(int smaller) {
  int x = M;
  int y = M + smaller;
  int r = tab[y];
  while(x / 2 != y / 2) {
    if (x % 2 == 0) r = max(r, tab[x + 1]);
    if (y % 2 == 1) r = max(r, tab[y - 1]);
    x /= 2; y /= 2;
  }
  return r;
}
 
int compare(const void * a, const void * b) {
  return(*(int*)a - *(int*)b);
}
 
int main()
{
  get_int(T);
 
  for(int i = 0; i < T; i++) {
    get_int(Ai);
 
    for(int j = 0; j < Ai; j++) {
      get_int(raw[j]);
      sequence[j] = raw[j];
    }
 
    /// PREPROCESING [skalowanie danych, z przedziału 10^9 robimy 5*10^5]
    qsort(raw, Ai, sizeof(int), compare);
    for(int j = 0; j < Ai; j++)
      sequence[j] = (int*) bsearch (&sequence[j], raw, Ai, sizeof (int), compare)-raw+1;
 
    /// STARTING [najdłuższy rosnący podciąg rozpoczynający się na danej pozycji] 
    starting[Ai-1] = 1;
    for(int j = (Ai-2); j >= 0; j--)
      starting[j] = (sequence[j] < sequence[j+1]) ? starting[j+1] + 1 : 1;
 
    /// ENDING [najdłuższy rosnący podciąg kończący się na danej pozycji] 
    ending[0] = 1;
    for(int j = 1; j < Ai; j++)
      ending[j] = (sequence[j-1] < sequence[j]) ? ending[j-1] + 1 : 1;
 
    /// MAIN LOOP
    longest = 0;
    for(int j = 0; j < Ai; j++) {
      longest = max(longest, query(sequence[j]-1) + starting[j]);
      insert(sequence[j], ending[j]);
    }
 
    memset(tab, 0, sizeof(tab));
    cout << longest << "\n";
  }
}