2012年4月6日
摘要: POJ_1436 这个题目最后统计的时候直接暴力即可,一开始想的时候以为这样过不了的,没想到大家都是暴力统计的……而且我用“优化”后的局部O(nlogn)的统计方式(注释部分的代码),反倒没有局部O(n^2)的统计方式快,看来真正horizontally visible的线段对确实比较少。 至于查询的过程,我们可以先把线段按x排序,然后逐一扫描,查询每个线段的下面还有哪些线段是可以“看得到”的,查询完之后再把线段所在的区间染色即可。 此外,由于如果我们将每个纵坐标看作一个区间的话,这样两个相邻的纵坐标之间就没有空当了,所以为了避免丢解,可以把线段的坐标全部乘以2,这样奇数的坐标就表示了两个纵坐 阅读全文
posted @ 2012-04-06 17:51 Staginner 阅读(272) 评论(0) 推荐(0) 编辑
摘要: POJ_3225 对于开区间还是闭区间的问题,可以把所有的点都乘以2,这样就可以通过偶数端点判断是闭区间,通过奇数端点判断开区间。 剩下的问题就是用线段树实现区间染色和区间取反的操作了。#include<stdio.h>#include<string.h>#define MAXD 132000#define N 131070int tree[4 * MAXD], rev[4 * MAXD], to[4 * MAXD], a[MAXD];void build(int cur, int x, int y){ int mid = (x + y) >> 1, ls 阅读全文
posted @ 2012-04-06 11:19 Staginner 阅读(274) 评论(0) 推荐(0) 编辑
摘要: HDU_1698 直接用线段树对区间成段更新即可。#include<stdio.h>#include<string.h>#define MAXD 100010int N, M, flag[4 * MAXD], sum[4 * MAXD];void build(int cur, int x, int y){ int mid = (x + y) >> 1, ls = cur << 1, rs = (cur << 1) | 1; flag[cur] = 0, sum[cur] = 1; if(x == y) return ; build(l 阅读全文
posted @ 2012-04-06 01:48 Staginner 阅读(200) 评论(0) 推荐(0) 编辑