質問
AtCoder初心者のものですが、ABC312のF問題がどうしても通らないです。
3時間ほどデバッグしているのですが、49個のテストケースのうち18個のWAの原因がわからないです。
心優しい方、ご教授よろしく願いいたします。
該当のソースコード
C++
1#include <iostream>2#include <vector>3#include <queue>4#include <deque>5#include <map>6#include <set>7#include <cassert>8#include <algorithm>9#include <functional>10#include <stack>11#include <string>12using namespace std;13using ll = long long;14 15 16 17int main() {18 ll M,N;19 cin>>N>>M;20 vector<ll> T(N);21 vector<ll> X(N);22 vector<ll> T0(0);23 vector<ll> T1(0);24 vector<ll> T2(0);25 for(int i=0;i<N;i++){26 cin>>T[i]>>X[i];27 if(T[i]==0){28 T0.push_back(X[i]);29 }30 else if(T[i]==1){31 T1.push_back(X[i]); 32 }33 else{34 T2.push_back(X[i]);35 }36 }37 38 sort(T0.begin(),T0.end());39 sort(T1.begin(),T1.end());40 sort(T2.begin(),T2.end());41 42 for(int i=1;i<T0.size();i++){43 T0[i]+=T0[i-1];44 }45 for(int i=1;i<T1.size();i++){46 T1[i]+=T1[i-1];47 }48 for(int i=1;i<T2.size();i++){49 T2[i]+=T2[i-1];50 }51 reverse(T2.begin(),T2.end());52 reverse(T0.begin(), T0.end()); reverse(T1.begin(), T1.end());53 54 55 vector<ll> T00(0);56 vector<ll> T11(0);57 vector<ll> T22(0);58 if(T0.size()!=0){59 for(int i=1;i<T0.size();i++){60 T00.push_back(T0[0]-T0[i]);61 }62 T00.push_back(T0[0]);63 }64 65 if(T1.size()!=0){66 for(int i=1;i<T1.size();i++){67 T11.push_back(T1[0]-T1[i]);68 }69 T11.push_back(T1[0]);70 }71 72 if(T2.size()!=0){73 for(int i=1;i<T2.size();i++){74 T22.push_back(T2[0]-T2[i]);75 }76 T22.push_back(T2[0]);77 }78 79 vector<ll> ans(M+1,-1);80 81 for(ll i=0;i<min(ll(T11.size()), M+1);i++){82 83 if(T22.size()==0&&i!=0)break;84 85 ll a=(lower_bound(T22.begin(), T22.end(), i)-T22.begin())+1ll;//使う缶切りの個数min値86 if(lower_bound(T22.begin(), T22.end(), i)==T22.end())break;87 if(i!=0&&T22.size()==0)continue;88 if(i==0)a=0;89 90 if(i+a>M)break;91 92 if(i!=0)93 ans[i]=T11[i-1];94 else ans[i]=0;95 96 ll b0=M-i-a;97 98 99 if(b0==0){100 continue;101 }102 103 else if(T00.size()!=0){104 if(b0<=T00.size())ans[i]+=T00[b0-1];105 else if(M-i-T22.size()<=T00.size())ans[i]+=T00[int(T00.size())-1];106 }107 108 else{109 if(M-i-T22.size()<=T00.size())continue;110 ans[i]=-1;111 }112 }113 114 ll aaa=-1;115 116 for(int i=0;i<M+1;i++){117 if(aaa<ans[i]){118 aaa=ans[i];119 }120 }121 122 cout<<max(0ll, aaa);123 124 125}126
補足情報(FW/ツールのバージョンなど)
C++でClang 10.0.0です。
0 コメント