====== 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
#include
#include
#include
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";
}
}