ACM练级日志:HDU 4288 离散化

来源:互联网 发布:java web高级编程下载 编辑:程序博客网 时间:2024/06/05 02:27

很久没有写线段树,今天看见这道题一开始以为是个平衡树,用set想暴力冲过去,结果失败了…… 但是看discuss里面有个大神居然直接用数组模拟冲过去了,不知道他怎么做到的!


一开始没想到要用线段树,这次也算是长经验了吧,这种散点、有序、还不重复的操作,其实可以离散化以后用线段树表示的,而且这种“每隔5个求和”似乎用平衡树系的数据结构也无力,而线段树天生的求和能力在这儿就体现出来了。


程序写起来并不麻烦,一开始错在两个地方,都是离散化后数组和原数组弄错了,离散化以后,所有操作都在离散化后数组做,没有原数组什么事了。


贴一下离散化去重部分:


sort(&appear[1], &appear[p_appear+1]);//p_appear是不同的数字个数p_appear = unique(appear+1, appear + p_appear +1) - numbers - 1;// unique函数会返回指向第一个重复元素的指针(迭代器)
......
int mirror = lower_bound(appear+1, appear + p_appear +1 , a[i]) - appear; //找到了对应的下标,注意如果后面可能出现appear数组里没有的数,还需要判断:if(appear[mirror] == a[i]) 


0 0
原创粉丝点击