社区讨论
维护凸包求调
P9124 [USACO23FEB] Bakery S参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @m1su0zc9
- 此快照首次捕获于
- 2024/10/03 13:04 去年
- 此快照最后确认于
- 2025/11/04 18:13 4 个月前
这道题不需要这么麻烦的办法
但是我想逝一试
于是WA on 样例了
求调
CPP#include<bits/stdc++.h>
using namespace std;
#define int long long
struct line{
int a,b,c;
long double k;
long double xp;//x轴交点
long double yp;//y轴交点
} lines[110];
/*
ax + by <= c
by <= -ax + c
y <= (-a / b)x + c/b
y = (-a/b)x +c/b;
x = 1 y = (c - a)/b
y = 1 x = (c - b)/a
*/
bool cmp(line a,line b){
return a.k > b.k;
}
int S[110],sp;
long double calc(int i1,int i2){
line l1 = lines[i1],l2 = lines[i2];
long double x = (1.00*l1.c / l1.b - 1.00 * l2.c / l2.b)/(1.00*l1.a / l1.b - 1.00 * l2.a / l2.b);
long double y = (1.00*l1.c / l1.a - 1.00 * l2.c / l2.a)/(1.00*l1.b / l1.a - 1.00 * l2.b / l2.a);
return x + y;
}
void solve(){
int n,C,M;
cin>>n>>C>>M;
memset(lines,0,sizeof(lines));
lines[1] = {1,0,C,-2e10,C,2e10};
lines[n+2] = {0,1,M,0,2e10,M};
for(int i = 2;i<=n+1;i++){
cin>>lines[i].a>>lines[i].b>>lines[i].c;
lines[i].k = -1.00 * lines[i].a / lines[i].b;
lines[i].xp = ((long double)lines[i].c - lines[i].b)/lines[i].a;
lines[i].yp = ((long double)lines[i].c - lines[i].a)/lines[i].b;
}
sort(lines+1,lines+1+n+2,cmp);
sp = 0;
S[++sp] = 1;
for(int i = 2;i<=n+2;i++){
if(lines[i].xp >= lines[S[sp]].xp){
continue;
}
while(sp && lines[S[sp]].yp >= lines[i].yp){
sp--;
}
S[++sp] = i;
}
int anst = (max(lines[S[1]].yp,lines[S[sp]].xp));
for(int i = 2;i<=sp;i++){
anst = max(anst,(int)(calc(S[i-1],S[i])));
}
cout<<C+M-anst<<'\n';
}
signed main(){
int T;
cin>>T;
while(T--){
solve();
}
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...