线段树—扫描线专题

hdu1542 Atlantis
矩形面积并
以前学线段树的时候对扫描线似懂非懂,关键是没明白为什么没有pushdown操作,现在总算弄懂了。。
因为在pushup里面当有线段覆盖时(cnt>0)直接对len域进行赋值,不依赖于儿子结点。这就相当于把这个结点当成了叶子结点(更新到底了),然后往上一路pushup,这样虽然导致该结点下面的结点信息可能有错,但是该结点以上的结点的信息保证正确。而询问是询问整段(len[1])的覆盖长度。这样每次询问时,根结点的信息是正确的就行了。

hdoj搜索题集

n久没刷题了,感觉水平退化太多了。。今天开始刷题。
把hdoj以前没做的搜索题做一下
hdu1072 简单题
我的思路:出发点和可重置时间的点没有必要访问两次,其他点可以重复访问。这样不会导致bfs一直进行下去。
其他思路:对于这种点可以重复访问的题,bfs入队时不仅要考虑坐标,还要考虑剩余时间,如果同一个点第二次入队时剩余时间比第一次大于或等于,那么不需要入队,没有意义。

hdu 5213——莫队算法

题目大意是给出n个自然数a[],1<=a[i]<=n,给出m个询问l1,r1,l2,r2.再给出k,问第一个数在[l1,r1],第二个数在[l2,r2],且两个数加起来等于k。这样的数有多少对。n,m都是<=30000
这题需要莫队算法。设ans[l,r]表示[l,r]之间有多少对这样的数。则答案=ans[l1,r2]-ans[l1,l2-1]-ans[r1+1,r2]+ans[r1+1,l2-1]
也就是说把每个询问分解成四个莫队算法那类题的四个询问,然后分块解决。
时间复杂度:n^1.5

PE工具编写

前几天把PE结构认真看了一下,顺便写了下类似peinfo的工具练练手,只不过是控制台的(windows sdk没怎么学,win32汇编也忘的差不多了,所以还是写成控制台的吧。。)。以前了解pe文件的时候总是走马观花,所以基本上印象全无。这次认认真真写写代码,收获还是比较大的。
说实话,pe结构的学习真的不难,但是非常考验耐心,特别是数据目录那里和资源结构那里,一层套一层,一定要耐心才行。
记下几个我认为重要的点,或者说收获:
0.rva和raw的转化
先看rva在哪个块(块表里面有一个块的起始rva和VirtualSize),块的起始raw也是可以得到的(也在对应的块表中)。然后raw=块起始raw+(rva-块起始rva)
简单吧。