摘要: 和树状数组插点求线刚好相反,插线求点看上去似乎是插点求线的逆操作,插点求线操作是:插点时更新后方+lowbit位置,求线时统计前方-lowbit 的和,插线求点反而是插线时修改前方lowbit位置值,求点时统计后方lowbit的和,插点求线代码见士兵杀敌(二),以下是插线求点的方法: 1 #include 2 #include 3 const int M=1000010; 4 int data[M]; 5 int Max; 6 inline int LowBit(int n) 7 { 8 return n&(-n); 9 }10 void Plus(int n,int value) / 阅读全文
posted @ 2013-07-18 20:54 SStep 阅读(236) 评论(0) 推荐(0) 编辑
摘要: 题目连接:http://acm.nyist.net/JudgeOnline/problem.php?pid=634分别从两个数组中各任取一个数相加,可以得到n^2个和,求这些和中最大的前m个数;我们把这n^2个和组织成如下n个有序表:表1:A1+B1 >= A1+B2 >= A1+B3 >= ...... 阅读全文
posted @ 2013-07-18 16:21 SStep 阅读(300) 评论(0) 推荐(0) 编辑
摘要: RMQ问题,即范围最小值问题(Range Minimum Query)ST表【任务】给定一个数组A[n],设计一个数据结构,支持查询操作Query(L,R):计算min{AL,AL+1,...AR}或者max{AL,AL+1,...AR} 1 #include 2 #include 3 using namespace std; 4 #define MAX 180012 5 int A[MAX][17],B[MAX][17]; 6 7 int RMQ(int L,int R) 8 { 9 int k = 0;10 while((1<<(k+1)) <= R-L+1) k++;1 阅读全文
posted @ 2013-07-18 15:25 SStep 阅读(219) 评论(0) 推荐(0) 编辑
摘要: 二叉索引数(树状数组)【任务】对于数组A[1..n],在O(logn)的时间内完成以下任务:(1) Add(x,d):让A[x]增加 d;(2) Query(L,R):计算A[L]+...+A[R]的和;(这题可作为树状数组的模板) 1 #include 2 #define Max 1000005 3 int C[Max]; 4 int N,M; 5 int lowbit(int x) 6 { 7 return x & -x; 8 } 9 int sum(int i)//计算前i项和10 {11 int ret = 0;12 while(i>0)13 {14 ... 阅读全文
posted @ 2013-07-18 11:38 SStep 阅读(233) 评论(0) 推荐(0) 编辑