Task: | Omenat |
Sender: | |
Submission time: | 2015-12-20 16:55:04 +0200 |
Language: | C++ |
Status: | READY |
Result: | 78 |
group | verdict | score |
---|---|---|
#1 | ACCEPTED | 77.5 |
test | verdict | time | score | |
---|---|---|---|---|
#1 | ACCEPTED | 0.79 s | 8.1 | details |
#2 | ACCEPTED | 0.79 s | 7.6 | details |
#3 | ACCEPTED | 0.78 s | 7.3 | details |
#4 | ACCEPTED | 0.78 s | 8.6 | details |
#5 | ACCEPTED | 0.79 s | 8.3 | details |
#6 | ACCEPTED | 0.79 s | 7.2 | details |
#7 | ACCEPTED | 0.79 s | 7 | details |
#8 | ACCEPTED | 0.78 s | 7.5 | details |
#9 | ACCEPTED | 0.78 s | 8.4 | details |
#10 | ACCEPTED | 0.78 s | 7.5 | details |
Code
#include <iostream> #include <algorithm> #include <cassert> #include <cstdlib> #include <cstring> #include <random> using namespace std; const int MN=101; typedef long long ll; typedef pair<int,int> P; P ps[MN]; int vs[MN]; const int MS = 100*1000; const int MS2 = MS/2; ll dp[MN][MS]; bool res[MN]; bool rres[MN]; int n; bool cur[MN]; std::mt19937 rng(666); double rnd() { return rng() / (double)rng.max(); } ll better(ll a, ll b) { return llabs(a) < llabs(b) ? a : b; } int scount; ll ssum; void solveSmall(ll bsum) { if (llabs(bsum) > ssum) { for(int i=0; i<scount; ++i) { res[i] = bsum<0; } return; } int x=scount; int sum=bsum; while(x>0) { int v=vs[x-1]; ll a = dp[x-1][sum+v + MS2]; // ll b = dp[x-1][sum-v + MS2]; // if (better(a,b) == a) { if (a == dp[x][sum + MS2]) { res[x-1] = 1; sum += v; } else { res[x-1] = 0; sum -= v; } --x; } } ll smallRes(ll bsum) { if (llabs(bsum) > ssum) { return llabs(bsum) - ssum; } return llabs(dp[scount][MS2+bsum]); } void sa() { ll r=0; for(int i=scount; i<n; ++i) { cur[i] = rng()&1; r += (2*cur[i]-1)*vs[i]; } ll best = smallRes(r); memcpy(res, cur, sizeof(res)); solveSmall(r); int iters=0; for(double t=20; t>0.001; t*=0.9999997) { ++iters; int x = rng()%n; int sign = cur[x] ? -2 : 2; ll rr = r + sign * vs[x]; ll srr = smallRes(rr); // if (srr < smallRes(r) || t>rnd()) { if (true) { cur[x] ^= 1; r = rr; if (srr < best) { best = srr; memcpy(res,cur,sizeof(res)); solveSmall(rr); } } } cerr<<"iters "<<iters<<'\n'; cerr<<"best "<<best<<'\n'; } int main() { cin>>n; for(int i=0; i<n; ++i) { int x; cin>>x; ps[i]=P(x,i); } sort(ps,ps+n); for(int i=0; i<n; ++i) vs[i]=ps[i].first; ll sum=0; for(int i=0; i<n; ++i) { sum+=vs[i]; if (sum < MS2) { ssum = sum; scount = i+1; } } cerr<<"scount "<<scount<<'\n'; // scount=ssum=0; for(int i=0; i<MS; ++i) { dp[0][i] = i-MS2; } for(int i=1; i<=scount; ++i) { int v = vs[i-1]; for(int j=0; j<MS; ++j) { if (j>v && j+v<MS) { dp[i][j] = better(dp[i-1][j-v], dp[i-1][j+v]); } else { dp[i][j] = 1e15; } // if (llabs(dp[i][j]) < ssum) cout<<"dp "<<i<<' '<<j<<" = "<<dp[i][j]<<'\n'; } } // cout<<dp[scount][MS2]<<'\n'; // assert(sum<MS2); if (scount == n) { solveSmall(0); } else { sa(); } for(int i=0; i<n; ++i) rres[ps[i].second] = res[i]; for(int i=0; i<n; ++i) cout<<1+rres[i]<<' ';cout<<'\n'; }
Test details
Test 1
Verdict: ACCEPTED
input |
---|
95 779724552 231968220 985023789 ... |
correct output |
---|
(empty) |
user output |
---|
2 1 2 1 2 1 1 1 2 2 1 2 2 1 1 ... |
Error:
scount 0 iters 33011621 best 72
Test 2
Verdict: ACCEPTED
input |
---|
85 229722261 51722691 862338862 8... |
correct output |
---|
(empty) |
user output |
---|
1 1 2 2 2 2 2 2 1 2 1 2 1 1 1 ... |
Error:
scount 0 iters 33011621 best 218
Test 3
Verdict: ACCEPTED
input |
---|
97 398995377 989444445 634573915 ... |
correct output |
---|
(empty) |
user output |
---|
2 2 2 1 1 1 1 2 1 1 1 2 2 2 1 ... |
Error:
scount 0 iters 33011621 best 410
Test 4
Verdict: ACCEPTED
input |
---|
99 843687873 164010938 51269970 4... |
correct output |
---|
(empty) |
user output |
---|
2 2 1 2 2 1 1 2 1 1 2 1 1 2 2 ... |
Error:
scount 0 iters 33011621 best 20
Test 5
Verdict: ACCEPTED
input |
---|
90 864611617 418460939 773297829 ... |
correct output |
---|
(empty) |
user output |
---|
1 1 2 1 2 1 1 2 2 1 2 1 2 2 2 ... |
Error:
scount 0 iters 33011621 best 42
Test 6
Verdict: ACCEPTED
input |
---|
92 289890246 25801423 763027596 7... |
correct output |
---|
(empty) |
user output |
---|
2 1 1 1 1 2 2 2 2 2 1 1 1 1 2 ... |
Error:
scount 0 iters 33011621 best 508
Test 7
Verdict: ACCEPTED
input |
---|
89 879039800 50522278 850785072 4... |
correct output |
---|
(empty) |
user output |
---|
2 2 1 1 1 2 2 2 1 2 2 1 1 2 1 ... |
Error:
scount 0 iters 33011621 best 992
Test 8
Verdict: ACCEPTED
input |
---|
96 27192469 222283781 681532515 1... |
correct output |
---|
(empty) |
user output |
---|
2 1 2 1 1 1 1 2 2 1 2 2 2 1 1 ... |
Error:
scount 0 iters 33011621 best 264
Test 9
Verdict: ACCEPTED
input |
---|
100 186459081 254674429 394007236 ... |
correct output |
---|
(empty) |
user output |
---|
1 2 1 2 1 2 1 1 2 1 2 2 2 1 2 ... |
Error:
scount 0 iters 33011621 best 34
Test 10
Verdict: ACCEPTED
input |
---|
98 612168861 979831717 671087051 ... |
correct output |
---|
(empty) |
user output |
---|
1 1 2 2 1 2 2 2 2 1 2 1 2 2 2 ... |
Error:
scount 0 iters 33011621 best 298