Task: | Maalarit |
Sender: | Binäärihau |
Submission time: | 2016-10-03 22:23:52 +0300 |
Language: | C++ |
Status: | READY |
Result: | 100 |
group | verdict | score |
---|---|---|
#1 | ACCEPTED | 12 |
#2 | ACCEPTED | 25 |
#3 | ACCEPTED | 31 |
#4 | ACCEPTED | 32 |
test | verdict | time | group | |
---|---|---|---|---|
#1 | ACCEPTED | 0.06 s | 1 | details |
#2 | ACCEPTED | 0.05 s | 1 | details |
#3 | ACCEPTED | 0.05 s | 1 | details |
#4 | ACCEPTED | 0.06 s | 1 | details |
#5 | ACCEPTED | 0.06 s | 1 | details |
#6 | ACCEPTED | 0.05 s | 1 | details |
#7 | ACCEPTED | 0.07 s | 2 | details |
#8 | ACCEPTED | 0.06 s | 2 | details |
#9 | ACCEPTED | 0.06 s | 2 | details |
#10 | ACCEPTED | 0.06 s | 2 | details |
#11 | ACCEPTED | 0.05 s | 2 | details |
#12 | ACCEPTED | 0.06 s | 2 | details |
#13 | ACCEPTED | 0.06 s | 3 | details |
#14 | ACCEPTED | 0.06 s | 3 | details |
#15 | ACCEPTED | 0.06 s | 3 | details |
#16 | ACCEPTED | 0.06 s | 3 | details |
#17 | ACCEPTED | 0.06 s | 3 | details |
#18 | ACCEPTED | 0.06 s | 3 | details |
#19 | ACCEPTED | 0.11 s | 4 | details |
#20 | ACCEPTED | 0.12 s | 4 | details |
#21 | ACCEPTED | 0.11 s | 4 | details |
#22 | ACCEPTED | 0.11 s | 4 | details |
#23 | ACCEPTED | 0.11 s | 4 | details |
#24 | ACCEPTED | 0.08 s | 4 | details |
Compiler report
input/code.cpp: In function 'int main()': input/code.cpp:172:9: warning: variable 'ansm' set but not used [-Wunused-but-set-variable] int ansm = 0; ^
Code
#include <bits/stdc++.h> #define uint unsigned int #define ull unsigned long long #define INF 1000000001 #define LINF 1000000000000000001 #define ll long long #define ld long double #define M 1000000007 #define E 0.0000001 #define N (1<<17) #define pii pair<int, int> #define pll pair<long long, long long> #define pdd pair<double, double> #define pld pair<long double, long double> #define cll complex<long long> #define cld complex<long double> #define X real() #define Y imag() #define C 'a' #define F first #define S second #define PI 3.1415926535897932384626433 using namespace std; ll v[2*N]; ll h[2*N]; void setv (int k, ll n) { k += N; v[k] = n; for (k /= 2; k >= 1; k /= 2) v[k] = min(v[2 * k], v[2 * k + 1]); } void setv2 (int k, ll n) { k += N; h[k] = n; for (k /= 2; k >= 1; k /= 2) h[k] = max(h[2 * k], h[2 * k + 1]); } ll lol (int a, int b) { a += N; b += N; ll ans = LINF; while (a <= b) { if (a % 2) ans = min(ans, v[a++]); if (b % 2 == 0) ans = min(ans, v[b--]); a /= 2; b /= 2; } return ans; } ll asd (int a, int b) { a += N; b += N; ll ans = 0; while (a <= b) { if (a % 2) ans = max(ans, h[a++]); if (b % 2 == 0) ans = max(ans, h[b--]); a /= 2; b /= 2; } return ans; } set<pair<pii, pair<int, ll>>> s; ll m = 0; int it = 1; int n; int c[N]; ll g[N]; set<pair<pii, pair<int, ll>>>::iterator q1; set<pair<pii, pair<int, ll>>>::iterator q2; void split (int i, bool b) { auto p = s.upper_bound({{i, INF}, {INF, LINF}}); --p; auto f = *p; s.erase(p); int x = f.first.first; int y = f.first.second; int z = f.second.first; setv2(z, 0); if (x != i) { ll t = (x != 1) * lol(x, i - 1); s.insert({{x, i - 1}, {++it, t}}); if (((i - 1 - x) % 2 == 0) != b) t = 0; setv2(it, t); } if (y != i) { ll t = (y != n) * lol(i + 1, y); //cout<<y<<" x "<<n<<endl; //cout<<i + 1<<" "<<y<<" -> "<<t<<endl; s.insert({{i + 1, y}, {++it, t}}); if (((i + 1 - y) % 2 == 0) != b) t = 0; setv2(it, t); } q1 = q2 = s.end(); if (b) { if (x != i) q1 = s.lower_bound({{x, 0}, {0, 0}}); if (y != i) q2 = s.lower_bound({{i + 1, 0}, {0, 0}}); } m = asd(1, it); } int brans[N]; ll brmin = LINF; int bra = 0; void brute2 (int n, int i, int v[], int c[], int r, int g, int b, int p) { if (n == i) { if (r + g + b < brmin) { brmin = r + g + b; bra = (r > 0) + (g > 0) + (b > 0); for (int j = 0; j < n; j++) brans[j] = c[j]; } return; } for (int j = 1; j <= 3; j++) { if (j == p) continue; c[i] = j; brute2(n, i + 1, v, c, j == 1 ? max(r, v[i]) : r, j == 2 ? max(g, v[i]) : g, j == 3 ? max(b, v[i]) : b, j); } } void brute (int n, int v[]) { int c[n]; for (int i = 0; i < n; i++) c[i] = 0; c[0] = 1; brute2(n, 1, v, c, v[0], 0, 0, 1); cout<<brmin<<" "<<bra<<endl; for (int i = 0; i < n; i++) cout<<brans[i]<<" "; cout<<endl; } int main () { srand(time(0)); n = 16; cin>>n; //cout<<n<<endl; int q[n]; for (int i = 0; i < 2 * N; i++) v[i] = LINF; vector<pair<ll, int>> w; for (int i = 0; i < n; i++) { ll x = (rand() % 100) + 1; //cout<<x<<" "; cin>>x; setv(i + 1, x); w.push_back({x, i + 1}); g[i] = x; q[i] = x; } //cout<<endl; if (n <= 10) brute(n, q), exit(0); sort(w.rbegin(), w.rend()); int ii = 0; for (int i = 0; i < n; i++) { if (w[ii].first != w[i].first) { random_shuffle(w.begin() + ii, w.begin() + i); ii = i; } } random_shuffle(w.begin() + ii, w.begin() + n); s.insert({{1, n}, {it, lol(1, n)}}); split(w[0].second, false); c[w[0].second] = 1; ll ans = LINF; int ansm = 0; int ansi = 1; for (int i = 1; i <= n; i++) { int x = w[i].second; //cout<<"SPLIT "<<x<<endl; split(x, true); //cout<<"DEBUG "<<w[0].first<<" "<<w[i].first<<" "<<m<<endl; if (ans > w[0].first + w[i].first + m) { ans = w[0].first + w[i].first + m; ansi = i; ansm = m; } if (q1 != s.end()) { int p = q1->second.first; ll t = q1->second.second; setv2(p, t - asd(p, p)); } if (q2 != s.end()) { int p = q2->second.first; ll t = q2->second.second; setv2(p, t - asd(p, p)); } if (c[x - 1] || c[x + 1]) break; c[x] = 1; } ll me, mo; me = mo = 0; for (int i = 0; i < n; i++) { if (i % 2) me = max(me, g[i]); else mo = max(mo, g[i]); } if (me + mo <= ans) { cout<<me + mo<<" "<<(me > 0) + (mo > 0)<<endl; for (int i = 0; i < n; i++) cout<<(i % 2) + 1<<" "; cout<<endl; } else { //cout<<ansm<<" "<<w[ansi].first<<" "<<w[0].first<<endl; for (int i = 1; i <= n; i++) { c[i] = 0; } for (int i = 0; i < ansi; i++) { c[w[i].second] = 1; } c[w[ansi].second] = 2; int a = 1; for (int b = 1; b <= n; b++) { if (c[b]) { if (a == 1) { for (int i = 1; i < b; i++) { if ((b - i) % 2 == 1) c[i] = 3 - c[b]; else c[i] = c[b]; } } else { if (c[b] == c[a - 1]) { if ((b - a) % 2 == 0) { int mi = a; for (int i = a; i < b; i++) { if (g[i - 1] < g[mi - 1]) mi = i; } c[mi] = 3; for (int i = a; i < mi; i++) { if ((i - a) % 2 == 0) c[i] = 3 - c[a - 1]; else c[i] = c[a - 1]; } for (int i = mi + 1; i < b; i++) { if ((b - i) % 2 == 1) c[i] = 3 - c[b]; else c[i] = c[b]; } } else { for (int i = a; i < b; i++) { if ((b - i) % 2 == 1) c[i] = 3 - c[b]; else c[i] = c[b]; } } } else { if ((b - a) % 2 == 0) { for (int i = a; i < b; i++) { if ((b - i) % 2 == 1) c[i] = 3 - c[b]; else c[i] = c[b]; } } else { int mi = a; for (int i = a; i < b; i++) { if (g[i - 1] < g[mi - 1]) mi = i; } c[mi] = 3; for (int i = a; i < mi; i++) { if ((i - a) % 2 == 0) c[i] = 3 - c[a - 1]; else c[i] = c[a - 1]; } for (int i = mi + 1; i < b; i++) { if ((b - i) % 2 == 1) c[i] = 3 - c[b]; else c[i] = c[b]; } } } } a = b + 1; } else if (b == n) { for (int i = a; i <= b; i++) { if ((i - a) % 2 == 0) c[i] = 3 - c[a - 1]; else c[i] = c[a - 1]; } } } ll f[] = {0, 0, 0}; for (int i = 1; i <= n; i++) f[c[i] - 1] = max(f[c[i] - 1], (ll)q[i - 1]); cout<<f[0] + f[1] + f[2]<<" "<<3 - (f[2] == 0)<<endl; for (int i = 1; i <= n; i++) cout<<c[i]<<" "; cout<<endl; } }
Test details
Test 1
Group: 1
Verdict: ACCEPTED
input |
---|
10 22 54 3 91 69 90 40 29 83 71 |
correct output |
---|
174 3 2 1 2 1 2 1 2 1 2 1 |
user output |
---|
174 2 1 2 1 2 1 2 1 2 1 2 |
Test 2
Group: 1
Verdict: ACCEPTED
input |
---|
10 49 3 96 38 90 18 92 74 83 1 |
correct output |
---|
170 3 1 2 1 2 1 2 1 2 1 2 |
user output |
---|
170 2 1 2 1 2 1 2 1 2 1 2 |
Test 3
Group: 1
Verdict: ACCEPTED
input |
---|
10 46 3 41 30 16 17 12 93 80 81 |
correct output |
---|
173 3 2 1 2 1 2 1 2 1 2 1 |
user output |
---|
173 2 1 2 1 2 1 2 1 2 1 2 |
Test 4
Group: 1
Verdict: ACCEPTED
input |
---|
10 46 8 95 85 82 73 82 92 53 90 |
correct output |
---|
187 3 1 2 1 2 1 2 1 2 1 2 |
user output |
---|
187 2 1 2 1 2 1 2 1 2 1 2 |
Test 5
Group: 1
Verdict: ACCEPTED
input |
---|
10 41 18 61 59 40 96 5 2 74 38 |
correct output |
---|
159 3 2 1 2 1 2 1 2 3 1 2 |
user output |
---|
159 3 1 2 1 2 1 2 1 3 2 1 |
Test 6
Group: 1
Verdict: ACCEPTED
input |
---|
10 1 1 1 1 1 1 1 1 1 1 |
correct output |
---|
2 3 2 1 2 1 2 1 2 1 2 1 |
user output |
---|
2 2 1 2 1 2 1 2 1 2 1 2 |
Test 7
Group: 2
Verdict: ACCEPTED
input |
---|
100 1 39 94 5 24 84 84 10 78 61 38... |
correct output |
---|
193 3 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 ... |
user output |
---|
193 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 ... |
Test 8
Group: 2
Verdict: ACCEPTED
input |
---|
100 31 73 18 88 49 28 66 5 32 48 9... |
correct output |
---|
199 3 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 ... |
user output |
---|
199 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 ... |
Test 9
Group: 2
Verdict: ACCEPTED
input |
---|
100 45 56 36 60 31 10 23 79 29 17 ... |
correct output |
---|
198 3 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 ... |
user output |
---|
198 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 ... |
Test 10
Group: 2
Verdict: ACCEPTED
input |
---|
100 1 77 70 62 21 68 40 54 90 62 1... |
correct output |
---|
194 3 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 ... |
user output |
---|
194 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 ... |
Test 11
Group: 2
Verdict: ACCEPTED
input |
---|
100 4 47 41 81 56 64 12 10 20 100 ... |
correct output |
---|
189 3 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 ... |
user output |
---|
189 3 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 ... |
Test 12
Group: 2
Verdict: ACCEPTED
input |
---|
10 1 1 1 1 1 1 1 1 1 1 |
correct output |
---|
2 3 2 1 2 1 2 1 2 1 2 1 |
user output |
---|
2 2 1 2 1 2 1 2 1 2 1 2 |
Test 13
Group: 3
Verdict: ACCEPTED
input |
---|
100 256160448 813097800 167146270 ... |
correct output |
---|
1929869257 3 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 ... |
user output |
---|
1929869257 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 ... |
Test 14
Group: 3
Verdict: ACCEPTED
input |
---|
100 520002672 3542567 24668528 959... |
correct output |
---|
1946957555 3 1 2 3 1 2 1 2 1 2 1 2 1 2 1 2 ... |
user output |
---|
1946957555 3 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 ... |
Test 15
Group: 3
Verdict: ACCEPTED
input |
---|
100 483158423 780224665 844754665 ... |
correct output |
---|
1959373560 3 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 ... |
user output |
---|
1959373560 3 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 ... |
Test 16
Group: 3
Verdict: ACCEPTED
input |
---|
100 969647264 128558017 889036329 ... |
correct output |
---|
1997942264 3 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 ... |
user output |
---|
1997942264 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 ... |
Test 17
Group: 3
Verdict: ACCEPTED
input |
---|
100 745018527 400495893 635468795 ... |
correct output |
---|
1961391143 3 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 ... |
user output |
---|
1961391143 3 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 ... |
Test 18
Group: 3
Verdict: ACCEPTED
input |
---|
10 1 1 1 1 1 1 1 1 1 1 |
correct output |
---|
2 3 2 1 2 1 2 1 2 1 2 1 |
user output |
---|
2 2 1 2 1 2 1 2 1 2 1 2 |
Test 19
Group: 4
Verdict: ACCEPTED
input |
---|
100000 197349274 775463806 263930657 ... |
correct output |
---|
1999942635 3 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 ... |
user output |
---|
1999942635 3 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 ... |
Test 20
Group: 4
Verdict: ACCEPTED
input |
---|
100000 102296405 34648120 320393597 9... |
correct output |
---|
1999930943 3 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 ... |
user output |
---|
1999930943 3 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 ... |
Test 21
Group: 4
Verdict: ACCEPTED
input |
---|
100000 781254921 418252056 502363453 ... |
correct output |
---|
1999987794 3 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 ... |
user output |
---|
1999987794 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 ... |
Test 22
Group: 4
Verdict: ACCEPTED
input |
---|
100000 849784881 230439009 455097426 ... |
correct output |
---|
1999979439 3 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 ... |
user output |
---|
1999979439 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 ... |
Test 23
Group: 4
Verdict: ACCEPTED
input |
---|
100000 851456132 13422224 537539701 4... |
correct output |
---|
1999948226 3 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 ... |
user output |
---|
1999948226 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 ... |
Test 24
Group: 4
Verdict: ACCEPTED
input |
---|
100000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
correct output |
---|
2 3 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 ... |
user output |
---|
2 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 ... |