摘要: 题意:有一个1到n的一个被打乱的排列,告诉你每个数的左边有多少个数比它小,显然第一个数左边没有比它小的数,求每个位置上的数。分析:用树状数组可以求出某一个序列中所有左边小于等于array[]的个数。这个题正好相反,已知每个数左边小于它的个数,求这个序列。用树状数组也可以做,但是没有线段树好理解。线段树中num记录[l,r]中还剩余多少人尚未被确定代码:View Code 1 #include <iostream> 2 #include <stdio.h> 3 #include <memory.h> 4 using namespace std; 5 const 阅读全文
posted @ 2012-08-17 20:20 pushing my way 阅读(244) 评论(0) 推荐(0) 编辑
摘要: 题意:给出一堆坐标点,求小于每一个坐标的坐标个数。分析:这个题显然也不能遍历,数据太大,会超时。从poj2299,知道树状数组可以用来求一个排列中array[i]前面小于等于array[i]的个数。例如array[i]= 9 1 0 5 4通过树状数组可以知道:array[1]=9--->1 即坐标小于等于1中比9小的个数为1.array[4]=5--->3 即坐标小于等于4中比5小的个数为3.具体怎么求呢?2299中也说过,构建树状数组时要将array[]进行排列,然后对对应的number号进行处理,即:1.要求原来顺序 9 1 0 5 4,前面小于等于array[i]的个数,先 阅读全文
posted @ 2012-08-17 11:36 pushing my way 阅读(197) 评论(0) 推荐(0) 编辑
摘要: 题意:求逆序对。分析:以前用分治的思想写的,这次用树状数组。以array[]=9 1 0 5 4 为例,1.对于每个array[i],求出小于等于array[i]的个数:9:11:10:15:34:3个这里如果遍历求的话,就超时了。因此需要构建树状数组,树状数组需要离散化。有:array[] 9 1 0 5 4num1 2 3 4 5这里不压缩要1--n内有时也行,如果数据小的话。比如这个例子就行,离散到大于等于1就行。但是如果数据大的话,就得压缩压下。2.用树状数组求小于等于array[i]的个数应该以array[]由小到大排序遍历i 1 2 3 4 5array 0 1 4 5 9num 阅读全文
posted @ 2012-08-17 09:37 pushing my way 阅读(217) 评论(0) 推荐(0) 编辑