A quanto pare io ed i Fenwick Tree non andiamo molto d’accordo.
Cosa fa il tuo algoritmo?
Ordino il vettore e cerco delle corrispondenze tra valori successivi, formando un ulteriore array che contiene il numero di volte in cui un determinato valore compare nel primo vettore. Ovviamente la dimensione di questo vettore è minore rispetto a quella del primo ed i valori rappresentati da ogni posizione del vettore rappresentano valori diversi.
Ma non usi nessun fenwick?
Sì scusa mi ero dimenticato di dirlo, uso un fenwick per la somma di tutti i valori di S, dove S[i] è il numero di sottostringhe che terminano per vet[i]
Ora ho cambiato algoritmo (credo che sostanzialmente sia corretto), ma ancora non funziona.
#include <fstream>
#include <algorithm>
#define MAXN 100010
using namespace std;int N;
int vet[MAXN], S[MAXN], fenwick[MAXN];void update(int p, int val){
for(;p<=N; p+=p&-p) fenwick[p]+=val;
}int query(int p){
int r=0;
for(; p; p-=p&-p) r+=fenwick[p];
return r;
}int main(){
ifstream in(“input.txt”);
in >> N;
for(int i=1; i<=N; i++)
in >> vet[i];
in.close();sort(vet+1, vet+N+1); update(1, 1); S[1]=1; for(int i=2; i<=N; i++){ if(vet[i].second > vet[i-1].second) if(vet[i].first!=vet[i-1].first) S[i] = query(i-1)+1; else S[i] = S[i-1]; else S[i] = 1; update(i, S[i]); } ofstream out("output.txt"); out << query(N) << "\n"; out.close(); return 0;
}
Uhm… ma per questo input scrivi correttamente zero?
3
3 2 1
No, restituisce 7. Immagino che non avevo capito cosa deve fare il programma…
#include <fstream>
#include <algorithm>
#define MAXN 100010
using namespace std;typedef pair<int,int> T;
int N;
int S[MAXN], fenwick[MAXN];
T vet[MAXN];void update(int p, int val){
for(; p<=N; p+=(p&-p)) fenwick[p]+=val;
}int query(int p){
int r=0;
for(; p; p-=(p&-p)) r+=fenwick[p];
return r;
}bool cmp(T el1, T el2){
if(el1.first==el2.first) return el1.second<el2.second; return el1.first<el2.first; }int main(){
ifstream in(“input.txt”);
in >> N;
for(int i=1; i<=N; i++){
in >> vet[i].first;
vet[i].second = i;
}
in.close();sort(vet+1, vet+N+1, cmp); S[1]=1;<p> update(1, 1);</p> for(int i=2; i<=N; i++){ if(vet[i].second > vet[i-1].second) if(vet[i].first!=vet[i-1].first){ S[i] = query(i-1)+1; update(i, S[i]); }else{ S[i] = S[i-1]; update(i, S[i]); } else{ S[i] = 1; update(i, 1); } } ofstream out("output.txt"); out << query(N) << "\n"; out.close(); return 0;
}
Hai ragione, volevo dire 3.Scusa ma non dovrebbe restituire 3? Cioè le Increasing Subsequences dovrebbero essere {3}, {2}, {1}.Lawliet
Vero, ci avevo pensato (infatti non sarebbe altro che l'insieme delle parti meno l'insieme vuoto) ma poi non ho più corretto.Comunque, un'osservazione: il risultato può essere molto grande (per n elementi distinti ordinati è 2n-1).
wil93
Questo non dovrebbe essere un problema, dato che il risultato deve essere modulo 1000000007...Hai ragione, volevo dire 3.Scusa ma non dovrebbe restituire 3? Cioè le Increasing Subsequences dovrebbero essere {3}, {2}, {1}.Lawliet
Comunque, un'osservazione: il risultato può essere molto grande (per n elementi distinti ordinati è 2n-1).wil93
Infatti ancora non funziona. Non che mi aspettassi di avere un 100/100, però nemmeno un miglioramento. Mark, posso sapere se l'algoritmo che hai usato è perlomeno simile al mio?Questo non dovrebbe essere un problema, dato che il risultato deve essere modulo 1000000007...Comunque, un'osservazione: il risultato può essere molto grande (per n elementi distinti ordinati è 2n-1).
wil93
mark03
È simile, cambia leggermente la funzione cmp che mi permette di evitare tutti i controlli che tu fai dopo…
Per la terza volta ho cambiato algoritmo e finalmente ho il mio 100/100.