Niestety, nie byliśmy w stanie w pełni poprawnie wyświetlić tego pliku, ponieważ nie jest zakodowany w UTF-8.
Możesz pobrać ten plik i spróbować otworzyć go samodzielnie.
#include <iostream>
#include <algorithm>
#include <cassert>
using namespace std;
long long min_suma[500007];
long long suma[500007];
int koszt[500007];
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int n;
cin>>n;
//cout<<"dupa\n";
long long s = 0;
for (int i = 1; i <= n; i++) {
min_suma[i] = 1000000000000000;
}
for (int i = 1; i <= n; i++) {
cin>>suma[i];
suma[i] += suma[i - 1];
if (suma[i] >= 0) { //ten prefiks si� w og�le da wyr�wna�
/*koszt[i] = i - 1; //tyle po��cze� trzeba wykona� pesymistycznie
for (int j = 0; j < i; j++) {
if (suma[j] <= suma[i]) {
koszt[i] = min(koszt[i], koszt[j] + (i - j - 1));
}
}
*/
long long* p = lower_bound(min_suma, min_suma + i, suma[i] + 1); //pierwszy wi�kszy ni� suma[i] lub i-ty je�li wszystkie mniejsze
// p - tab - 1 = ostatni mniejszy r�wny sumie
koszt[i] = (i - 1) - (int)(p - min_suma - 1);;
min_suma[i - koszt[i]] = min(min_suma[i - koszt[i]], suma[i]);
//cout<<koszt[i]<<" ";
}
else {
koszt[i] = 1000000000;
//cout<<"INF ";
}
/*
for (int j = 1; j <= n; j++) {
if (min_suma[j] < 1000000000)
cout<<min_suma[j]<<" ";
else
cout<<"INF ";
}
cout<<endl;*/
}
cout<<koszt[n]<<"\n";
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | #include <iostream> #include <algorithm> #include <cassert> using namespace std; long long min_suma[500007]; long long suma[500007]; int koszt[500007]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n; cin>>n; //cout<<"dupa\n"; long long s = 0; for (int i = 1; i <= n; i++) { min_suma[i] = 1000000000000000; } for (int i = 1; i <= n; i++) { cin>>suma[i]; suma[i] += suma[i - 1]; if (suma[i] >= 0) { //ten prefiks si� w og�le da wyr�wna� /*koszt[i] = i - 1; //tyle po��cze� trzeba wykona� pesymistycznie for (int j = 0; j < i; j++) { if (suma[j] <= suma[i]) { koszt[i] = min(koszt[i], koszt[j] + (i - j - 1)); } } */ long long* p = lower_bound(min_suma, min_suma + i, suma[i] + 1); //pierwszy wi�kszy ni� suma[i] lub i-ty je�li wszystkie mniejsze // p - tab - 1 = ostatni mniejszy r�wny sumie koszt[i] = (i - 1) - (int)(p - min_suma - 1);; min_suma[i - koszt[i]] = min(min_suma[i - koszt[i]], suma[i]); //cout<<koszt[i]<<" "; } else { koszt[i] = 1000000000; //cout<<"INF "; } /* for (int j = 1; j <= n; j++) { if (min_suma[j] < 1000000000) cout<<min_suma[j]<<" "; else cout<<"INF "; } cout<<endl;*/ } cout<<koszt[n]<<"\n"; } |
English