Submission details
Task:Zigzag
Sender:OOliOO_slayer
Submission time:2015-09-16 18:24:49 +0300
Language:C++
Status:READY
Result:
Test results
testverdicttime
#10.05 sdetails
#20.06 sdetails
#30.05 sdetails
#40.06 sdetails
#50.06 sdetails
#60.05 sdetails
#70.05 sdetails
#80.05 sdetails
#90.06 sdetails
#100.05 sdetails
#110.07 sdetails
#120.05 sdetails
#130.05 sdetails
#140.06 sdetails
#150.06 sdetails
#160.06 sdetails
#170.06 sdetails
#180.05 sdetails
#190.07 sdetails
#200.06 sdetails
#210.05 sdetails
#220.05 sdetails
#23ACCEPTED0.05 sdetails

Code

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <map>
#include <utility>
#include <set>

typedef long long LL;

using namespace std;

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n; cin >> n;
    vector<int> v;
    for(int i = 0; i < n; i++){
        int x; cin >> x; v.push_back(x);
    }
    vector<int> up(n), down(n), psv(n), pgv(n);
    up[0] = 1;
    down[0] = 1;
    psv[0] = -1; pgv[0] = -1;
    
    for(int i = 1; i < n; i++){
        if(v[i] == v[i-1]){
            up[i] = up[i-1];
            down[i] = down[i-1];
            psv[i] = psv[i-1];
            pgv[i] = pgv[i-1];
        }
        else if(v[i] > v[i-1]){
            // Increasing
            psv[i] = i-1;
            int prev = pgv[i-1]; // Search for prev greater
            
            while(prev != -1 && v[prev] <= v[i]){
                prev = pgv[prev];
            }
            pgv[i] = prev;
        }
        else if(v[i] < v[i-1]){
            // Decreasing
            pgv[i] = i-1;
            int prev = psv[i-1];
            while(prev != -1 && v[prev] >= v[i]){
                prev = psv[prev];
            }
            psv[i] = prev;
        }
        up[i] = psv[i] == -1 ? 1 : down[psv[i]] + 1;
        down[i] = pgv[i] == -1 ? 1 : up[pgv[i]] + 1;
    }
    /*for(auto x : psv) cout << x << " "; cout << endl;
    for(auto x : pgv) cout << x << " "; cout << endl;
    for(auto x : up) cout << x << " "; cout << endl;
    for(auto x : down) cout << x << " "; cout << endl;*/
    
    int ans = 0;
    for(int i = 0; i < n; i++){
        ans = max(ans,up[i]);
        ans = max(ans,down[i]);
    }
    cout << ans << endl;
}


Test details

Test 1

Verdict:

input
26914
209563339 493138663 352519700 ...

correct output
17861

user output
13289

Test 2

Verdict:

input
69623
448426297 297876050 307483466 ...

correct output
46402

user output
34535

Test 3

Verdict:

input
74436
633012861 731816315 697620472 ...

correct output
49602

user output
37247

Test 4

Verdict:

input
40279
561990353 513856090 901866509 ...

correct output
26955

user output
20406

Test 5

Verdict:

input
51496
683270487 631068160 190804676 ...

correct output
34326

user output
25372

Test 6

Verdict:

input
97124
1000007 1000006 1000003 100000...

correct output
61495

user output
48379

Test 7

Verdict:

input
91945
1000005 1000005 1000006 100000...

correct output
58521

user output
46551

Test 8

Verdict:

input
96629
1000004 1000010 1000003 100001...

correct output
61327

user output
48863

Test 9

Verdict:

input
92161
1000042 1000001 1000055 100001...

correct output
60962

user output
45481

Test 10

Verdict:

input
96806
1000057 1000002 1000011 100006...

correct output
64127

user output
48040

Test 11

Verdict:

input
99118
1000084 1000083 1000002 100008...

correct output
66012

user output
49528

Test 12

Verdict:

input
98412
1000959 1000993 1000257 100064...

correct output
65720

user output
48724

Test 13

Verdict:

input
90443
1000341 1000111 1000853 100021...

correct output
60148

user output
45264

Test 14

Verdict:

input
94265
1000087 1000461 1000534 100020...

correct output
62824

user output
47798

Test 15

Verdict:

input
91433
1001939 1009857 1000325 100505...

correct output
60938

user output
46072

Test 16

Verdict:

input
96457
1005466 1001970 1000639 100288...

correct output
64111

user output
48305

Test 17

Verdict:

input
91928
1003162 1008129 1007967 100683...

correct output
61129

user output
46089

Test 18

Verdict:

input
96494
1076481 1008804 1047323 102583...

correct output
64214

user output
48214

Test 19

Verdict:

input
98136
1025253 1017437 1050227 105377...

correct output
65345

user output
48434

Test 20

Verdict:

input
90294
1098032 1037085 1089672 105311...

correct output
60164

user output
45180

Test 21

Verdict:

input
100000
19836 85811 67650 86807 50191 ...

correct output
66639

user output
50299

Test 22

Verdict:

input
100000
999999998 999999999 999999996 ...

correct output
59975

user output
50437

Test 23

Verdict: ACCEPTED

input
11
1000000000 1000000000 10000000...

correct output
4

user output
4