题解:P16434 [APIO 2026 中国赛区] 蛋糕
chenhanzheapple · · 题解
传送门
解法
sub 1
对于每个在
::::success[代码]
#include<bits/stdc++.h>
//#define int long long
#define endl '\n'
using namespace std;
int compare_tastiness(std::vector<int> S1, std::vector<int> S2);
vector<int> bake_cakes(int n,int w,int k){
vector<int> a;
if(k==100){
for(int i=1;i<=w;i++){
a.push_back(i);
}
return a;
}
}
int find_tastiness(int n,int w,int k){
if(k==100){
for(int i=1;i<n;i++){
vector<int> x,y;
x.push_back(i-1),y.push_back(i);
if(compare_tastiness(x,y)==0){
return i;
}
}
return w;
}
}
::::
sub 2
仍然对于每个在
::::success[代码]
#include<bits/stdc++.h>
//#define int long long
#define endl '\n'
using namespace std;
int compare_tastiness(std::vector<int> S1, std::vector<int> S2);
vector<int> bake_cakes(int n,int w,int k){
vector<int> a;
if(n==3 && w==3 && k==1){
a.push_back(1);
a.push_back(2);
a.push_back(3);
return a;
}
}
int find_tastiness(int n,int w,int k){
if(n==3 && w==3 && k==1){
vector<int> x,y;
x.push_back(0);
x.push_back(3);
y.push_back(1);
y.push_back(2);
int tmp = compare_tastiness(x,y);
if(tmp==-1){
return 3;
}
else if(tmp==0){
return 2;
}
return 1;
}
}
::::
sub 3
注意到
我们分别制作大小为
具体的,我们从后往前枚举每一个
如果确定了,就先尝试把
答案即为
代码中有一些细节。
::::success[代码]
#include<bits/stdc++.h>
//#define int long long
#define endl '\n'
using namespace std;
int compare_tastiness(std::vector<int> S1, std::vector<int> S2);
vector<int> bake_cakes(int n,int w,int k){
vector<int> a;
if(n==40 && w==1e9 && k==30){
for(int i=0;i<=29;i++){
a.push_back(1<<i);
}
return a;
}
}
int find_tastiness(int n,int w,int k){
if(w==1e9 && k==30){
vector<int> x;
int pos = -1,res = 0;
for(int i=29;i>=0;i--){
if(pos==-1){
vector<int> y,z;
y.push_back(i);
for(int j=0;j<i;j++){
z.push_back(j);
}
if(y.empty() || z.empty()){
return 1;
}
int tmp = compare_tastiness(y,z);
if(tmp==1){
pos = i+1;
x.push_back(i);
res+=(1<<i);
}
}
else{
x.push_back(i);
vector<int> y;
y.push_back(pos);
if(x.empty() || y.empty()){
return 1;
}
int tmp = compare_tastiness(x,y);
if(tmp==1){
x.pop_back();
}
else{
res+=(1<<i);
}
}
}
return res;
}
}
::::
sub 4
仍然对于每个在
注意到
具体的,首先取到两个三等分点
仍然有一些细节。
::::success[代码]
#include<bits/stdc++.h>
//#define int long long
#define endl '\n'
using namespace std;
int compare_tastiness(std::vector<int> S1, std::vector<int> S2);
vector<int> bake_cakes(int n,int w,int k){
vector<int> a;
for(int i=1;i<=2200;i++){
a.push_back(i);
}
return a;
}
int find_tastiness(int n,int w,int k){
int l = 1,r = 1;
while(r<=w){
r*=3;
}
while(l<r-1){
int mid = l+(r-l+1)/3,mid2 = mid+(r-l+1)/3-1;
vector<int> x,y;
x.push_back(mid-1);
x.push_back(mid2);
y.push_back(l-1);
y.push_back(r);
int t = compare_tastiness(x,y);
if(t==0){
l = mid,r = mid2;
}
else if(t==1){
l = mid2+1;
}
else{
r = mid-1;
}
}
return l;
}
::::
完整代码
::::success[代码]
#include<bits/stdc++.h>
//#define int long long
#define endl '\n'
using namespace std;
int compare_tastiness(std::vector<int> S1, std::vector<int> S2);
vector<int> bake_cakes(int n,int w,int k){
vector<int> a;
if(n==3 && w==3 && k==1){
a.push_back(1);
a.push_back(2);
a.push_back(3);
return a;
}
if(n==40 && w==1e9 && k==30){
for(int i=0;i<=29;i++){
a.push_back(1<<i);
}
return a;
}
if(k==100){
for(int i=1;i<=w;i++){
a.push_back(i);
}
return a;
}
for(int i=1;i<=2200;i++){
a.push_back(i);
}
return a;
}
int find_tastiness(int n,int w,int k){
if(n==3 && w==3 && k==1){
vector<int> x,y;
x.push_back(0);
x.push_back(3);
y.push_back(1);
y.push_back(2);
int tmp = compare_tastiness(x,y);
if(tmp==-1){
return 3;
}
else if(tmp==0){
return 2;
}
return 1;
}
if(w==1e9 && k==30){
vector<int> x;
int pos = -1,res = 0;
for(int i=29;i>=0;i--){
if(pos==-1){
vector<int> y,z;
y.push_back(i);
for(int j=0;j<i;j++){
z.push_back(j);
}
if(y.empty() || z.empty()){
return 1;
}
int tmp = compare_tastiness(y,z);
if(tmp==1){
pos = i+1;
x.push_back(i);
res+=(1<<i);
}
}
else{
x.push_back(i);
vector<int> y;
y.push_back(pos);
if(x.empty() || y.empty()){
return 1;
}
int tmp = compare_tastiness(x,y);
if(tmp==1){
x.pop_back();
}
else{
res+=(1<<i);
}
}
}
return res;
}
if(k==100){
for(int i=1;i<n;i++){
vector<int> x,y;
x.push_back(i-1),y.push_back(i);
if(compare_tastiness(x,y)==0){
return i;
}
}
return w;
}
int l = 1,r = 1;
while(r<=w){
r*=3;
}
while(l<r-1){
int mid = l+(r-l+1)/3,mid2 = mid+(r-l+1)/3-1;
vector<int> x,y;
x.push_back(mid-1);
x.push_back(mid2);
y.push_back(l-1);
y.push_back(r);
int t = compare_tastiness(x,y);
if(t==0){
l = mid,r = mid2;
}
else if(t==1){
l = mid2+1;
}
else{
r = mid-1;
}
}
return l;
}
::::