076 - Cake Cut(★3)

・問題URL

https://atcoder.jp/contests/typical90/tasks/typical90_bx

・発想

・輪になってんのうざいから直線にしたれ。ってのは思いついたけど、前は二分探索知らなくて無理だった。

・解法

ケーキを直線にして同じのもう一個つなげると「連続するピース」が扱いやすい。(別に3個以上連続してもその区間は答えにならないから、3個以上つなげてもいい。)次に、小数は危険なので全部のピースを10倍して前から累積和を出す。累積和の配列をAとすると、rep(i,2*N)でA[i+1]~A[2N-1]の中に(ケーキの大きさ)-A[i]があるかをbinary_searchで求めればおけ。

・コード

int main(){

 ll N;
 cin>>N;
 vector<ll>A(2*N),sum(2*N);
 rep(i,N){
   cin>>A[i];
   A[N+i]=A[i];
 }
 ll SUM=0;
 rep(i,N)SUM+=A[i];
 rep(i,2*N){
   A[i]*=10;
 }
 ll cake=0;
 rep(i,2*N){
   cake+=A[i];
   sum[i]=cake;
 }
 

 bool Q=binary_search(sum.begin(),sum.end(),SUM);
 for(int i=1;i<2*N;i++){
   if(Q)break;
   Q=binary_search(sum.begin()+i,sum.end(),SUM+sum[i-1]);
 }

 if(Q)cout<<"Yes"<<endl;
 else cout<<"No"<<endl;

}

この記事が気に入ったらサポートをしてみませんか?