bzoj 2794 [Poi2012]Cloakroom dp
2016-11-15 09:45
253 查看
一开始写了个线段树,每个节点维护个背包,然后发现查询时没法合并,就gg了。
先把所有点按m和a[i]排序。然后就是支持添加物品,询问能组成k的b[i]的最小值最大。然后直接dp就好了。
先把所有点按m和a[i]排序。然后就是支持添加物品,询问能组成k的b[i]的最小值最大。然后直接dp就好了。
#include <bits/stdc++.h> using namespace std; #define N 1100 #define M 1100000 #define A 100000 #define ls l,mid,now<<1 #define rs mid+1,r,now<<1|1 int n,q,top; int ans[M],f[A+10]; struct node { int x,y,z,pos; node(){} node(int x,int y,int z):x(x),y(y),z(z){} friend bool operator < (const node &r1,const node &r2) {return r1.x<r2.x;} }a ,b[M]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d%d%d",&a[i].z,&a[i].x,&a[i].y); sort(a+1,a+1+n); scanf("%d",&q); for(int i=1;i<=q;i++) { scanf("%d%d%d",&b[i].x,&b[i].y,&b[i].z); b[i].pos=i;b[i].z+=b[i].x; } sort(b+1,b+1+q);f[0]=1<<30; for(int i=1,now=1;i<=q;i++) { while(now<=n&&a[now].x<=b[i].x) { for(int j=A;j>=a[now].z;j--) f[j]=max(f[j],min(f[j-a[now].z],a[now].y)); now++; } ans[b[i].pos]=f[b[i].y]>b[i].z ? 1:0; } for(int i=1;i<=q;i++) puts(ans[i] ? "TAK":"NIE"); return 0; }
相关文章推荐
- bzoj2794 [Poi2012]Cloakroom ( 背包DP+离线 )
- BZOJ 2794: [Poi2012]Cloakroom 询问离线 背包dp
- bzoj 2794 [Poi2012]Cloakroom 离线+背包
- BZOJ2794 : [Poi2012]Cloakroom
- BZOJ 2794: [Poi2012]Cloakroom 背包DP
- [BZOJ 2795]POI2012 A Horrible Poem
- bzoj2795: [Poi2012]A Horrible Poem
- 【POI2012】【BZOJ2795】A Horrible Poem
- BZOJ 2792 Poi2012 Well 二分答案
- bzoj 2798 [Poi2012]Bidding 博弈论 dp
- bzoj 2790 [Poi2012] Distance 转化+调和级数
- bzoj 2799 [Poi2012]Salaries 贪心
- 【bzoj2796】 [Poi2012]Fibonacci Representation
- bzoj 2797 [Poi2012]Squarks 枚举一个,推出所有
- bzoj 2798 [Poi2012]Bidding 博弈论+dp
- bzoj 2791 [Poi2012]Rendezvous 基环森林
- BZOJ2792: [Poi2012]Well
- BZOJ2789 [Poi2012]Letters
- 【BZOJ】【P2789】【Poi2012】【Letters】【题解】【逆序对】
- BZOJ 2802 Poi2012 Warehouse Store 堆+贪心