题解:AT_agc034_c [AGC034C] Tests
\text{Solution}
看题解区都是二分的方法,这样的复杂度是
考虑贪心,首先,假设已知最终高桥君的每科分数,那么对于分数比青木君大的场,
显然若存在这样的
那么有了这个性质,我们就可以先计算初始状态下青木君的总得分
1.若唯一的不为
2.若唯一的不为
/*
Luogu name: Symbolize
Luogu uid: 672793
*/
#include<bits/stdc++.h>
#define int long long
#define pii pair<int,int>
#define x first
#define y second
#define rep1(i,l,r) for(register int i=l;i<=r;++i)
#define rep2(i,l,r) for(register int i=l;i>=r;--i)
#define rep3(i,x,y,z) for(register int i=x[y];~i;i=z[i])
#define rep4(i,x) for(auto i:x)
#define debug() puts("----------")
const int N=2e6+10;
const int inf=0x3f3f3f3f3f3f3f3f;
using namespace std;
int n,x;
struct node
{
int b;
int l,r;
int w;
}a[N];
bool cmp(node a,node b){return a.w>b.w;}
int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return f*x;
}
signed main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
n=read();
x=read();
int sum=0;
rep1(i,1,n)
{
a[i].b=read();
a[i].l=read();
a[i].r=read();
a[i].w=(x-a[i].b)*a[i].r+a[i].b*a[i].l;
sum+=a[i].b*a[i].l;
}
sort(a+1,a+n+1,cmp);
rep1(i,1,n)
{
if(sum-a[i].w<=0)
{
int ans=inf;
rep1(j,i,n)
{
if(sum-a[j].b*a[j].l<=0) ans=min(ans,(sum+a[j].l-1)/a[j].l);
else ans=min(ans,a[j].b+(sum-a[j].b*a[j].l+a[j].r-1)/a[j].r);
}
rep1(j,1,i-1)
{
int now=sum+a[j].w-a[i].w;
if(now-a[i].w<=0)
{
if(now-a[j].b*a[j].l<=0) ans=min(ans,(now+a[j].l-1)/a[j].l);
else ans=min(ans,a[j].b+(now-a[j].b*a[j].l+a[j].r-1)/a[j].r);
}
}
cout<<(i-1)*x+ans<<"\n";
return 0;
}
sum-=a[i].w;
}
return 0;
}