hdu 2795(单点修改)
2015-08-11 10:50
357 查看
题意:有h×w大的公告板,有n条公告要写入,每条公告高度都是1,宽度是wi,每次从最上最左的空位写,如果有空位输出第几行,如果没有足够空位输出-1。
题解:注意h最大1e9,但其实是看n的大小,因为如果有n条公告最多占n行,所以线段树最大是min(h,n)。
题解:注意h最大1e9,但其实是看n的大小,因为如果有n条公告最多占n行,所以线段树最大是min(h,n)。
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 200005; int h, w, n, sum[N << 2]; void pushup(int k) { sum[k] = max(sum[k * 2], sum[k * 2 + 1]); } void build(int k, int left, int right) { if (left == right) { sum[k] = w; return; } int mid = (left + right) / 2; build(k * 2, left, mid); build(k * 2 + 1, mid + 1, right); pushup(k); } int query(int k, int left, int right, int x) { if (left == right) { sum[k] -= x; return left; } int mid = (left + right) / 2, res = -1; if (sum[k * 2] >= x) res = query(k * 2, left, mid, x); else if (sum[k * 2 + 1] >= x) res = query(k * 2 + 1, mid + 1, right, x); pushup(k); return res; } int main() { while (scanf("%d%d%d", &h, &w, &n) == 3) { int temp = h < n ? h : n; build(1, 1, temp); int x; for (int i = 0; i < n; i++) { scanf("%d", &x); if (x > w || sum[1] < x) printf("-1\n"); else printf("%d\n", query(1, 1, temp, x)); } } return 0; }
相关文章推荐
- 检测CPU利用率的Shell脚本
- Num 31 : HDOJ : 1863 畅通工程 [ kruskal( 克鲁斯卡尔 )算法 ] [ 最小生成树 ]
- X的追求道路 SDUT 3027
- hdoj 1863 畅通工程 【最小生成树】
- 21-IO流-15-IO流(字符流-缓冲区-复制文本文件)
- 21-IO流-16-IO流(字符流-缓冲区-自定义MyBufferedReader-read方法)
- 本地推送的使用方法
- 手机端开发
- 浅析Android的横竖屏切换
- hdu 4109(拓扑排序 关键路径)
- SSL心跳漏洞的检测
- IOS开发 @property中assign、copy 、retain等关键字的理解
- 算法竞赛入门经典: 第三章 数组和字符串 3.3蛇形填数
- 21-IO流-14-IO流(字符流-缓冲区-BufferedReader-readLine方法原理)
- Oracle 12C -- Invisible Columns
- Error: L6218E: Undefined symbol main (referred from entry9a.o).
- Algorithms-94.Binary Tree Inorder Traversal
- ACM Computer Factory
- 21-IO流-13-IO流(字符流-缓冲区-BufferedReader)
- php5.4和apache2.4.9不在同一台服务器的配置注意事项