제출 #975056

#제출 시각아이디문제언어결과실행 시간메모리
975056LucaIlie비스킷 담기 (IOI20_biscuits)C++17
9 / 100
1101 ms710076 KiB
#include "biscuits.h" #include <bits/stdc++.h> using namespace std; const int k = 60; long long x; long long biscuits[k]; long long sum[k][k], mask[k][k]; int ind[k][k]; queue<pair<int, long long>> solutions; vector<int> sol; int p; bool cmp( int p1, int p2 ) { //long long r1 = ((mask[p][p1] >> (p1 - p)) + sum[p][p1] - x) >> p2, r2 = ((mask[p][p2] >> (p2 - p)) + sum[p][p2] - x) >> p1; return ((__int128)mask[p][p1] << p) + (((__int128)sum[p][p1] - x) << p1) > ((__int128)mask[p][p2] << p) + (((__int128)sum[p][p2] - x) << p2); } long long count_tastiness( long long X, vector <long long> a ) { long long s; x = X; a.resize( k ); s = 0; for ( int b = 0; b < k; b++ ) { a[b] += s; if ( a[b] > x ) { s = a[b] - x; a[b] = x + s % 2; s /= 2; } else s = 0; biscuits[b] = a[b]; } for ( int i = 0; i < k; i++ ) { sum[i][i] = biscuits[i]; for ( int j = i + 1; j < k; j++ ) { mask[i][j] = mask[i][j - 1] + (((long long)sum[i][j - 1] % 2) << (j - i - 1)); sum[i][j] = sum[i][j - 1] / 2 + biscuits[j]; //printf( "%d %d: %d %d\n", i, j, sum[i][j], mask[i][j] ); } } for ( int b = 0; b < k; b++ ) { for ( int i = b; i < k; i++ ) ind[b][i] = i; p = b; sort( ind[b] + b, ind[b] + k, cmp ); } int ans = 0; solutions.push( { 0, 0 } ); while ( !solutions.empty() ) { int b = solutions.front().first; long long s = solutions.front().second; solutions.pop(); ans++; s >>= 1; for ( int j = b; j < k; j++ ) { int i = ind[b][j]; long long cs = ((s + mask[b][i]) >> (i - b)) + sum[b][i]; // printf( "%d %d %d\n", b, i, cs ); if ( cs >= x ) solutions.push( { i + 1, cs - x } ); else break; } } return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...