IT民工
加油!
摘要: 线段树的一个应用,求逆序数。思路为:sum[i]为0代表i未出现,为1则已经出现,然后查询时我们只要统计新加入的数到n-1这个范围内有多少个sum[i]为1,也就是当前数的逆序,然后累加,就是我们要求的逆序数。因为其他形式都可以由第一次求得的逆序数递推而来,所以只需计算一次。/*2012-08-07 16:54:38 Accepted 1394 78MS 252K 1478 B G++ Yu*/#include<stdio.h>#include<algorithm>using namespace std;#define lson l, m, rt ... 阅读全文
posted @ 2012-08-07 17:02 找回失去的 阅读(190) 评论(0) 推荐(0)
摘要: 转自http://www.2cto.com/kf/201111/111542.html1. 逆序数所谓逆序数,就是指一个序列S[i],统计处于序列的每个数的比这个数大并且排在它前面的数的数目,然后对于所有数,把这个数目加起来求和就是了。比如4 3 1 24第一个,所以数目为03的前面是4,大于3的数目为11的前面是4 3 ,大于1的数目为22的前面是4 3 1,大于2的数目为2所以逆序数为1+2+2 = 5求逆序数的两种方法常规方法是按照逆序数的规则做,结果复杂度是O(n*n),一般来说,有两种快速的求逆序数的方法分别是归并排序和树状数组法2. 归并排序归并排序是源于分而治之思想,详细的过程可 阅读全文
posted @ 2012-08-07 16:20 找回失去的 阅读(6248) 评论(0) 推荐(0)
摘要: 同样是线段树,这道题是求区间最值,单点更新。线段树代码愈发熟练。/*2012-08-07 16:02:53 Accepted 1754 1093MS 2276K 1361 B G++ Yu*/#include<stdio.h>#include<algorithm>using namespace std;#define lson l, m, rt << 1#define rson m + 1, r, rt << 1 | 1const int MAXN = 200020;int Max[MAXN << 2];int n, m;void P 阅读全文
posted @ 2012-08-07 16:05 找回失去的 阅读(122) 评论(0) 推荐(0)
摘要: 线段树的基础题,之前写过,今天看了刘汝佳的《高级数据结构》又写了一次,对线段树的理解也更深了。/*2012-08-07 15:45:14 Accepted 1166 343MS 736K 1598 B G++ Yu*/#include<stdio.h>#include<string.h>#define lson l, m, rt << 1#define rson m + 1, r, rt << 1 | 1const int MAXN = 50050;int sum[MAXN << 2];int n;void PushUp(int rt 阅读全文
posted @ 2012-08-07 15:48 找回失去的 阅读(182) 评论(0) 推荐(0)
摘要: 星星的级别就是横坐标小于它,纵坐标不大于它的点个数。因为输入是有序的,纵坐标没有起到作用,所以只要注意x值就行了。用树状数组来实现/*Accepted 376K 110MS C++ 774B 2012-08-07 10:58:07*/#include<stdio.h>#include<string.h>#include<stdlib.h>const int MAXN = 1 << 15;int T[MAXN], ans[MAXN];int lowb(int t){ return t & (-t);}void insert(int i){ 阅读全文
posted @ 2012-08-07 12:00 找回失去的 阅读(205) 评论(0) 推荐(1)
摘要: 算是学了一个模版吧#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>const double eps = 1e-8;struct point{ double x, y;};point a, b, c, d;inline int dcmp(double d){ if(fabs(d) < eps) return 0; return d > 0 ? 1 : -1;}inline double det(double x1, double y1, doubl 阅读全文
posted @ 2012-08-07 10:01 找回失去的 阅读(251) 评论(0) 推荐(0)