BZOJ2794: [Poi2012]Cloakroom

题目大意:n个物品有三个属性a,b,c,q个询问每次给出m,k,s,问能不能在物品中选出一些使得每个的a≤m,b>m+s,c的和正好等于k


看完题感觉无从下手....

然后就去翻了题解,感觉还是挺水的....

先离线,把询问按m排序,物品按a排序,这样就相当于每次添加物品,问能不能在正好凑出c的情况下让最小的b大于m+s

这就可以直接背包了....

时间复杂度O(QlogQ+N*10^5)


#include
#include
#include
#include
#define N 1000010
using namespace std; 
struct object{int a,b,c;}a[N];
struct query{int m,k,s,num;}b[N];
bool cmpo(object x,object y){return x.a=a[j].c;k--)
			f[k]=max(f[k],min(f[k-a[j].c],a[j].b));
			j++;
		}
		if(f[b[i].k]>b[i].m+b[i].s) ans[b[i].num]=true;
	}
	for(i=1;i<=q;i++)
	if(ans[i]) puts("TAK");
	else puts("NIE");
}

你可能感兴趣的:(BZOJ,POI,离线处理,DP,背包DP)