結果
問題 | No.1309 テスト |
ユーザー | beet |
提出日時 | 2020-05-31 20:38:32 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
RE
|
実行時間 | - |
コード長 | 6,527 bytes |
コンパイル時間 | 2,354 ms |
コンパイル使用メモリ | 205,228 KB |
実行使用メモリ | 6,948 KB |
最終ジャッジ日時 | 2024-09-13 03:27:43 |
合計ジャッジ時間 | 9,549 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 94 ms
6,816 KB |
testcase_01 | RE | - |
testcase_02 | RE | - |
testcase_03 | RE | - |
testcase_04 | RE | - |
testcase_05 | RE | - |
testcase_06 | AC | 2 ms
6,940 KB |
testcase_07 | AC | 2 ms
6,940 KB |
testcase_08 | AC | 1 ms
6,944 KB |
testcase_09 | AC | 2 ms
6,940 KB |
testcase_10 | AC | 2 ms
6,940 KB |
testcase_11 | AC | 2 ms
6,944 KB |
testcase_12 | AC | 2 ms
6,944 KB |
testcase_13 | AC | 2 ms
6,944 KB |
testcase_14 | AC | 2 ms
6,944 KB |
testcase_15 | AC | 2 ms
6,940 KB |
testcase_16 | AC | 2 ms
6,940 KB |
testcase_17 | AC | 2 ms
6,940 KB |
testcase_18 | AC | 2 ms
6,940 KB |
testcase_19 | AC | 2 ms
6,940 KB |
testcase_20 | AC | 2 ms
6,940 KB |
testcase_21 | AC | 2 ms
6,944 KB |
testcase_22 | AC | 2 ms
6,944 KB |
testcase_23 | AC | 2 ms
6,940 KB |
testcase_24 | AC | 2 ms
6,940 KB |
testcase_25 | RE | - |
testcase_26 | RE | - |
testcase_27 | RE | - |
testcase_28 | RE | - |
testcase_29 | RE | - |
testcase_30 | RE | - |
testcase_31 | RE | - |
testcase_32 | RE | - |
testcase_33 | AC | 2 ms
6,940 KB |
testcase_34 | RE | - |
testcase_35 | RE | - |
testcase_36 | AC | 2 ms
6,944 KB |
testcase_37 | RE | - |
testcase_38 | RE | - |
testcase_39 | RE | - |
testcase_40 | RE | - |
testcase_41 | RE | - |
testcase_42 | RE | - |
testcase_43 | RE | - |
testcase_44 | RE | - |
testcase_45 | AC | 2 ms
6,944 KB |
testcase_46 | AC | 3 ms
6,940 KB |
testcase_47 | AC | 3 ms
6,944 KB |
testcase_48 | AC | 3 ms
6,940 KB |
testcase_49 | AC | 3 ms
6,944 KB |
testcase_50 | AC | 2 ms
6,944 KB |
testcase_51 | AC | 2 ms
6,944 KB |
testcase_52 | AC | 2 ms
6,940 KB |
testcase_53 | WA | - |
testcase_54 | AC | 3 ms
6,940 KB |
testcase_55 | AC | 3 ms
6,944 KB |
testcase_56 | AC | 2 ms
6,940 KB |
testcase_57 | AC | 3 ms
6,940 KB |
testcase_58 | AC | 3 ms
6,940 KB |
testcase_59 | AC | 3 ms
6,944 KB |
testcase_60 | AC | 3 ms
6,944 KB |
testcase_61 | AC | 2 ms
6,940 KB |
testcase_62 | AC | 2 ms
6,940 KB |
testcase_63 | AC | 3 ms
6,940 KB |
testcase_64 | WA | - |
testcase_65 | AC | 54 ms
6,944 KB |
testcase_66 | AC | 118 ms
6,944 KB |
testcase_67 | AC | 81 ms
6,944 KB |
testcase_68 | AC | 76 ms
6,940 KB |
testcase_69 | AC | 103 ms
6,944 KB |
testcase_70 | AC | 113 ms
6,940 KB |
testcase_71 | AC | 281 ms
6,940 KB |
testcase_72 | AC | 309 ms
6,940 KB |
testcase_73 | AC | 293 ms
6,944 KB |
testcase_74 | AC | 26 ms
6,940 KB |
testcase_75 | AC | 13 ms
6,940 KB |
testcase_76 | AC | 15 ms
6,940 KB |
testcase_77 | AC | 7 ms
6,940 KB |
testcase_78 | AC | 2 ms
6,940 KB |
testcase_79 | AC | 2 ms
6,944 KB |
testcase_80 | RE | - |
testcase_81 | RE | - |
testcase_82 | RE | - |
testcase_83 | RE | - |
testcase_84 | AC | 188 ms
6,940 KB |
testcase_85 | AC | 106 ms
6,940 KB |
testcase_86 | AC | 63 ms
6,940 KB |
ソースコード
#include <bits/stdc++.h> using namespace std; template<typename T1,typename T2> inline void chmin(T1 &a,T2 b){if(a>b) a=b;} template<typename T1,typename T2> inline void chmax(T1 &a,T2 b){if(a<b) a=b;} using Int = long long; const char newl = '\n'; //INSERT ABOVE HERE // |{ x | x \in [s, t]}| Int num(Int s,Int t){ assert(s<=t+1); return t-s+1; } // take n min elements from [s, t] Int calc_lb(Int s,Int t,Int n){ assert(num(s,t)>=n); return (s+s+n-1)*n/2; } // take n max elements from [s, t] Int calc_ub(Int s,Int t,Int n){ assert(num(s,t)>=n); return (t-(n-1)+t)*n/2; } // sum of [s, t] Int calc(Int s,Int t){ assert(s<=t+1); return (s+t)*(t-s+1)/2; } Int N,P,X,Y; // take X * F if S_contains_X // take C1 from [S1, T1] * F // take U from [S1, T1] at most F-1 // take C2 from [S2, T2] * F Int type01(Int F,Int C,Int S_contains_X, Int S1,Int T1,Int C1,Int U1, Int S2,Int T2,Int C2,Int U2){ assert(C1 + S_contains_X + C2 == C); assert(U1 > 0 and U2==0); Int D1=(U1-1)/(F-1); Int E1=U1-D1*(F-1); assert(0<=D1 and 0<E1 and E1<=(F-1)); assert(num(S1,T1)>=C1+D1+1); assert(num(S2,T2)>=C2); Int act_X = X * S_contains_X; const Int INF = 1e18; Int res=-INF; { Int lb=calc_lb(S1,T1-(D1+1),C1)+act_X+calc_lb(S2,T2,C2); Int ub=calc_ub(S1,T1-(D1+1),C1)+act_X+calc_ub(S2,T2,C2); if(lb<=Y*C and Y*C<=ub) chmax(res, +Y*C*F +(T1-D1)*E1 +calc(T1-D1+1,T1)*(F-1)); } { Int lb=calc_lb(T1-(C1+D1)+1,T1,C1)+act_X+calc(T2-C2+1,T2); Int ub=calc_ub(T1-(C1+D1)+1,T1,C1)+act_X+calc(T2-C2+1,T2); if(lb<=Y*C and Y*C<=ub) chmax(res, +Y*C +(calc(T1-(C1+D1)+1,T1)+act_X+calc(T2-C2+1,T2))*(F-1) +(T1-(C1+D1))*E1); } { Int diff=(calc(T1-(C1+D1)+1,T1-D1)+act_X+calc(T2-C2+1,T2))-Y*C; if(0<=diff and diff<=C1) chmax(res, +Y*C*F +(T1-(C1+D1)+diff)*E1 +calc(T1-D1+1,T1)*(F-1)); } return res; } // take X * F if S_contains_X // take C1 from [S1, T1] * F // take U1 from [S1, T1] at most F-1 // take C2 from [S2, T2] * F // take U2 from [S2, T2] at most F-1 Int type02(Int F,Int C,Int S_contains_X, Int S1,Int T1,Int C1,Int U1, Int S2,Int T2,Int C2,Int U2){ assert(C1 + S_contains_X + C2 == C); assert(U1 > 0 and U2 > 0); Int D1=(U1-1)/(F-1); Int E1=U1-D1*(F-1); assert(0<=D1 and 0<E1 and E1<=(F-1)); Int D2=(U2-1)/(F-1); Int E2=U2-D2*(F-1); assert(0<=D2 and 0<E2 and E2<=(F-1)); assert(num(S1,T1)>=C1+D1+1); assert(num(S2,T2)>=C2+D2+1); Int act_X = X * S_contains_X; const Int INF = 1e18; Int res=-INF; { Int lb=calc_lb(S1,T1-(D1+1),C1)+act_X+calc_lb(S2,T2-(D2+1),C2); Int ub=calc_ub(S1,T1-(D1+1),C1)+act_X+calc_ub(S2,T2-(D2+1),C2); if(lb<=Y*C and Y*C<=ub) chmax(res, +Y*C*F +(T1-D1)*E1 +calc(T1-D1+1,T1)*(F-1) +(T2-D2)*E2 +calc(T2-D2+1,T2)*(F-1)); } { Int lb=calc_lb(T1-(C1+D1)+1,T1,C1)+act_X+calc_lb(T2-(C2+D2)+1,T2,C2); Int ub=calc_ub(T1-(C1+D1)+1,T1,C1)+act_X+calc_ub(T2-(C2+D2)+1,T2,C2); if(lb<=Y*C and Y*C<=ub) chmax(res, +Y*C +(calc(T1-(C1+D1)+1,T1)+act_X+calc(T2-(C2+D2)+1,T2))*(F-1) +(T1-(C1+D1))*E1 +(T2-(C2+D2))*E2); } { Int diff=(+calc(T1-(C1+D1)+1,T1-D1) +act_X +calc(T2-(C2+D2+1)+1,T2-(D2+1)))-Y*C; if(0<=diff and diff<=C1) chmax(res, +Y*C*F +(T1-(C1+D1)+diff)*E1 +calc(T1-D1+1,T1)*(F-1) +(T2-D2)*E2 +calc(T2-D2+1,T2)*(F-1)); } { Int diff=(+calc(T1-(C1+D1)+1,T1-D1) +act_X +calc(T2-(C2+D2)+1,T2-D2))-Y*C; if(0<=diff and diff<=C2) chmax(res, +Y*C*F +(T1-(C1+D1))*E1 +calc(T1-D1+1,T1)*(F-1) +(T2-(C2+D2)+diff)*E2 +calc(T2-D2+1,T2)*(F-1)); } return res; } signed solve(){ cin>>N>>P>>X>>Y; assert(N&1); assert(N!=3); if(N==1){ if(X==Y) cout<<X<<newl; else cout<<-1<<newl; return 0; } if(X==0){ if(X==Y) cout<<P*(N/2)<<newl; else cout<<-1<<newl; return 0; } if(X==P){ if(X==Y) cout<<P*N<<newl; else cout<<-1<<newl; return 0; } Int ans=-1; /* S: set of mode F: frequency of mode C: |S| (\sum_{s \in S} s) = Y * C */ // F = 1 -> sum = Y * N // X \in S if(num(0,X-1)>=N/2 and num(X+1,P)>=N/2){ Int sum=Y*N; Int lb=calc_lb(0,X-1,N/2)+X+calc_lb(X+1,P,N/2); Int ub=calc_ub(0,X-1,N/2)+X+calc_ub(X+1,P,N/2); if(lb<=sum and sum<=ub) chmax(ans,sum); } // F > 1 for(Int F=2;F<=N;F++){ for(Int C=1;C*F<=N;C++){ for(Int S_contains_X=0;S_contains_X<=1;S_contains_X++){ for(Int A=0;A+S_contains_X<=C;A++){ Int B=C-A-S_contains_X; if(!(num(0,X-1)>=A and num(X+1,P)>=B)) continue; Int act_X = X * S_contains_X; { Int lb=calc_lb(0,X-1,A)+act_X+calc_lb(X+1,P,B); Int ub=calc_ub(0,X-1,A)+act_X+calc_ub(X+1,P,B); if(!(lb<=Y*C and Y*C<=ub)) continue; } Int V=min((num(X+1,P)-B)*(F-1),N/2-B*F); Int W=S_contains_X?0:min(N-C*F-V,F-1); Int U=N-C*F-V-W; if(!(U>=0 and V>=0)) continue; if(!S_contains_X and !(W>0)) continue; if(!(num(0,X-1)>=A+(U+(F-2))/(F-1))) continue; if(!(num(X+1,P)>=B+(V+(F-2))/(F-1))) continue; if(!(A*F+U<=N/2 and B*F+V<=N/2)) continue; if(U==0 and V==0){ chmax(ans,Y*C*F+W*X); continue; } if(V==0){ chmax(ans, type01(F,C,S_contains_X, 0,X-1,A,U, X+1,P,B,V)+W*X); continue; } if(U==0){ chmax(ans, type01(F,C,S_contains_X, X+1,P,B,V, 0,X-1,A,U)+W*X); continue; } chmax(ans, type02(F,C,S_contains_X, 0,X-1,A,U, X+1,P,B,V)+W*X); chmax(ans, type02(F,C,S_contains_X, X+1,P,B,V, 0,X-1,A,U)+W*X); } } } } cout<<ans<<newl; return 0; } signed main(){ cin.tie(0); ios::sync_with_stdio(0); const Int T = 10; for(Int t=0;t<T;t++) solve(); return 0; }