【BZOJ2794】[Poi2012]Cloakroom

Description

有n件物品,每件物品有三个属性a[i], b[i], c[i] (a[i]<b[i])。
再给出q个询问,每个询问由非负整数m, k, s组成,问是否能够选出某些物品使得:
1. 对于每个选的物品i,满足a[i]<=m且b[i]>m+s。
2. 所有选出物品的c[i]的和正好是k。

Input

第一行一个正整数n (n<=1,000),接下来n行每行三个正整数,分别表示c[i], a[i], b[i] (c[i]<=1,000, 1<=a[i]<b[i]<=10^9)。
下面一行一个正整数q (q<=1,000,000),接下来q行每行三个非负整数m, k, s (1<=m<=10^9, 1<=k<=100,000, 0<=s<=10^9)。

Output

输出q行,每行为TAK (yes)或NIE (no),第i行对应第i此询问的答案。

Sample Input

5
6 2 7
5 4 9
1 2 4
2 5 8
1 3 9
5
2 7 1
2 7 2
3 2 0
5 7 2
4 1 5

Sample Output

TAK
NIE
TAK
TAK
NIE

题解:容易想到离线处理,先将物品和询问都按A从小到大排序,一边将物品加入背包一边处理询问,但是还有一个限制B,怎么搞?

发现我们的背包是一个判断可行性的背包,也就是说里面的数都是0或1,这其实是一种空间的浪费,我们不妨想办法将这些空间利用起来,作为B的限制。

于是令f[i]表示选出C的和为i时,背包中B值最小的那个物品的B值最大是多少(因为B越大越优,所以我们尽可能将B大的装入背包),然后查询的时候只要判断f[i]是否大于m+s就好了。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int f[1000010];
struct item
{
int A,B,C;
}p[1010];
int n,m,mk;
struct query
{
int l,r,v,org;
}q[1000010];
int ans[1000010];
bool cmp1(item a,item b)
{
return a.A<b.A;
}
bool cmp2(query a,query b)
{
return a.l<b.l;
}
int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
int main()
{
scanf("%d",&n);
int i,j,k;
for(i=1;i<=n;i++) p[i].C=rd(),p[i].A=rd(),p[i].B=rd();
scanf("%d",&m);
for(i=1;i<=m;i++) q[i].l=rd(),q[i].v=rd(),q[i].r=rd(),mk=max(mk,q[i].v),q[i].org=i;
sort(p+1,p+n+1,cmp1);
sort(q+1,q+m+1,cmp2);
f[0]=1<<30;
for(i=j=1;i<=m;i++)
{
for(;p[j].A<=q[i].l&&j<=n;j++)
{
for(k=mk;k>=p[j].C;k--) f[k]=max(f[k],min(f[k-p[j].C],p[j].B));
}
ans[q[i].org]=(q[i].l+q[i].r<f[q[i].v]);
}
for(i=1;i<=m;i++)
{
if(ans[i]) printf("TAK\n");
else printf("NIE\n");
}
return 0;
}

最新文章

  1. Linux Shell函数
  2. 采用ETL with RDBMS模式来实现ETL
  3. Tomcat中解决sql server连接失败--- java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlserver.SQLServerDriver
  4. 剑指Offer14 逆序链表
  5. HDU 1074 Doing Homework (dp+状态压缩)
  6. HDU 5926 Mr. Frog&#39;s Game 【模拟】 (2016CCPC东北地区大学生程序设计竞赛)
  7. iOS:判断昨天,今天,今年
  8. Xmpp实现简单聊天系列 --- ②用户注册和登陆
  9. VS开发入门一:VS常用快捷键大全,工欲善其事必先利其器 只看标红的吧
  10. python 传递多个参数
  11. VLAN 及 GVRP 配置
  12. Delphi 7~XE系列升级安装Indy10.6
  13. 《Android源代码设计模式解析与实战》读书笔记(十)
  14. thinkCMF----如何写标签
  15. 【题解】 洛谷P2340 奶牛会展
  16. C#DirectX播放视频
  17. registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped.
  18. Centos7 安装ipython 和 ipython3
  19. 【构造】AtCoder Regular Contest 079 D - Decrease (Contestant ver.)
  20. Microsoft office2007免费版下载(安装 + 破解)

热门文章

  1. 对Socket CAN的理解(5)——【Socket CAN控制器的初始化过程】
  2. C#秘密武器之泛型
  3. Unity Shader 效果学习
  4. Linux——CentOS 6.3下PostgreSQL 的安装与配置
  5. lodash capitalize 首字母大写
  6. 取给定正整数的指定bit位開始的指定长度的数据
  7. 人工智能: 自动寻路算法实现(四、D、D*算法)
  8. chrome mp4格式支持问题
  9. unity, windows: Unhandled Exception: System.UnauthorizedAccessException: Access to the path &quot;XXX\Temp\Assembly-CSharp.dll.mdb&quot; is denied
  10. 经过Nginx代理后如何区分HTTP请求头中的X-Forwarded-For和X-Real-IP,以及Java示例