题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2795

题意:有一个 h * w 的板子,要在上面贴 n 条 1 * x 的广告,在贴第 i 条广告时要尽量将其靠上贴,并输出其最上能贴在哪个位置;

思路:可以将每行剩余空间大小存储到一个数组中,那么对于当前 1 * x 的广告,只需找到所有剩余空间大于的 x 的行中位置最小的即可;

不过本题数据量为 2e5,直接暴力因该会 tle.可以用个线段树维护一下区间最大值,然后查询时对线段树二分即可;

代码:

 #include <iostream>
#include <stdio.h>
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
using namespace std; const int MAXN = 2e5 + ;
int Max[MAXN << ], h, w, n; int max(int a, int b){
return a > b ? a : b;
} void push_up(int rt){
Max[rt] = max(Max[rt << ], Max[rt << | ]);
} void build(int l, int r, int rt){//建树
Max[rt] = w;
if(l == r) return;
int mid = (l + r) >> ;
build(lson);
build(rson);
} void update(int p, int x, int l, int r, int rt){//单点更新
if(l == r){
Max[rt] -= x;
return;
}
int mid = (l + r) >> ;
if(p <= mid) update(p, x, lson);
else update(p, x, rson);
push_up(rt);
} int query(int x, int l, int r, int rt){//查询
if(l == r) return l;
int mid = (l + r) >> ;
int ans = ;
if(Max[rt << ] >= x) ans = query(x, lson);
else ans = query(x, rson);
return ans;
} int main(void){
while(~scanf("%d%d%d", &h, &w, &n)){
if(h > n) h = n;
build(, h, );
while(n--){
int x, cnt;
scanf("%d", &x);
if(Max[] < x){
printf("-1\n");
continue;
}else printf("%d\n", cnt = query(x, , h, ));
update(cnt, x, , h, );
}
}
return ;
}

其实这个代码中的更新的路径和查询的路径是一样的,可以优化一下,将更新写进查询里面去;

优化代码:

 #include <iostream>
#include <stdio.h>
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
using namespace std; const int MAXN = 2e5 + ;
int Max[MAXN << ], h, w, n; int push_up(int rt){
Max[rt] = max(Max[rt << ], Max[rt << | ]);
} void build(int l, int r, int rt){
Max[rt] = w;
if(l == r) return;
int mid = (l + r) >> ;
build(lson);
build(rson);
} int query(int x, int l, int r, int rt){
if(l == r){
Max[rt] -= x;
return l;
}
int mid = (l + r) >> ;
int cnt = (Max[rt << ] >= x) ? query(x, lson) : query(x, rson);
push_up(rt);
return cnt;
} int main(void){
while(~scanf("%d%d%d", &h, &w, &n)){
if(h > n) h = n;
build(, h, );
while(n--){
int x;
scanf("%d", &x);
if(Max[] < x) printf("-1\n");
else printf("%d\n", query(x, , h, ));
}
}
return ;
}

最新文章

  1. Node.js:DNS模块的使用
  2. 背水一战 Windows 10 (29) - 控件(文本类): RichTextBlock, RichTextBlockOverflow, RichEditBox
  3. SharePoint文档库,如何在新窗口打开中的文件
  4. CXF学习(2) helloworld
  5. solr5.5教程-solrconfig.xml,加载schema.xml
  6. 详细的OS X Yosemite 10.10懒人版安装教程
  7. MAC OS Nginx php-fpm相关
  8. oracle使用LEFT JOIN关联产生的问题在查询结果中使用CASE WHEN 无法判断
  9. 关于jQuery中的ajax的方法介绍
  10. jQuery图片轮播(一)轮播实现并封装
  11. Sql语言简介——检索数据
  12. linux 下修改网关mac地址
  13. 自学PYTHON分享 --基础1
  14. 使用maven profile指定配置文件打包适用多环境
  15. 快速排序Qsort
  16. 七牛云注册创建oss并配置自定义域名
  17. Java+Jmeter接口测试
  18. python简说(八)random
  19. BZOJ 1412 [ZJOI2009]狼和羊的故事 | 网络流
  20. ibatis.net:尽可能的使用匿名类型替换 Hashtable

热门文章

  1. 简单Android代码混淆(转)
  2. loj#2269. 「SDOI2017」切树游戏
  3. html(HyperText Markup Language)--超文本标记语言
  4. Spark- Spark Yarn模式下跑yarn-client无法初始化SparkConext,Over usage of virtual memory
  5. POJ 2976 Dropping tests:01分数规划【二分】
  6. HDU 4652 Dice:期望dp(成环)【错位相减】
  7. 分享知识-快乐自己: Oracle数据库实例、用户、表、表空间之间关系
  8. Java_Time_01_获取当前时间
  9. (转)C语言之原码、反码和补码
  10. STL中mem_fun和mem_fun_ref的用法