4863. 【GDOI2017模拟11.5】Market
2016-11-05 16:30
435 查看
Description
Data Constraint
Solution
对于60分的解法,我们直接打个背包即可。然后我们发现:M[I]实在太大了,所以我们设出f[i]表示在价值为i的情况下的最小代价,转移方式与原来相同,然后每个询问二分一下答案即可。由于v[i]*n最多只有90000,所以复杂度为O(300n2)。
Code
#include<iostream> #include<cmath> #include<cstring> #include<cstdio> #include<algorithm> #define ll long long using namespace std; const int maxn=100005,mx=90000; struct code{ int a,b,c; }a[maxn],b[maxn]; ll n,m,i,t,j,k,l,r,mid,f[mx+5],ans[maxn],g[mx+5]; bool cmp(code x,code y){ return x.c<y.c; } int main(){ freopen("market.in","r",stdin);freopen("market.out","w",stdout); //freopen("data.in","r",stdin);freopen("data.out","w",stdout); scanf("%lld%lld",&n,&m); for (i=1;i<=n;i++) scanf("%lld%lld%lld",&a[i].a,&a[i].b,&a[i].c); sort(a+1,a+n+1,cmp); for (i=1;i<=m;i++) scanf("%lld%lld",&b[i].c,&b[i].a),b[i].b=i; sort(b+1,b+m+1,cmp);j=1; memset(f,127,sizeof(f));f[0]=0;memset(g,127,sizeof(g)); for (i=1;i<=m;i++){ while (a[j].c<=b[i].c && j<=n){ for (k=mx-a[j].b;k>=0;k--) if (f[k]>=0)f[k+a[j].b]=min(f[k+a[j].b],f[k]+a[j].a); for (k=mx;k>=0;k--) g[k]=min(g[k+1],f[k]); j++; } l=0; r=mx; while (l<r){ mid=(l+r+1)/2; if (g[mid]>b[i].a) r=mid-1; else l=mid; } ans[b[i].b]=l; } for (i=1;i<=m;i++) printf("%lld\n",ans[i]); }
相关文章推荐
- JZOJ 4863 【GDOI2017模拟11.5】Market
- JZOJ 4863. 【GDOI2017模拟11.5】Market
- 【GDOI2017模拟11.5】Market
- 【GDOI2017模拟11.5】Market
- 【GDOI2017模拟11.5】Dash Speed
- GDOI2017模拟11.5 总结
- 【GDOI2017模拟9.10】子串
- 【GDOI2017模拟9.9】[IOI2007]偶环
- 【GDOI2017模拟一试4.11】腐女的生日(线段树+维护一次函数)
- 【GDOI2017第三轮模拟day2】魔法咒语(AC自动机,矩阵乘法)
- 【GDOI2017第四轮模拟day1】数列
- JZOJ4857. 【GDOI2017模拟11.4】Tourist Attractions
- NOIP2015模拟11.5总结
- 【GDOI2017模拟8.11】生物学家
- GDOI2017模拟2.16
- 【GDOI2017模拟2.25】神秘物质
- JZOJ4774 【GDOI2017模拟9.10】子串 线段树合并维护SAM的fail树信息(CF 666E类似)
- 【GDOI2017模拟9.21】三色图
- 【GDOI2017模拟一试4.11】颜色树(容斥||点剖||DP)
- 【GDOI2017第四轮模拟day2】绝版题