|
|
|
|
|
|
随笔分类 -
线段树
zoj3597(Hit the Target!)(线段树)
摘要:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3597他人具体代码:View Code #include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define lson l,m,x<<1#define rson m+1,r,x<<1|1const int maxn = 100010;int Max[maxn<<2],col[maxn<<2];stru
阅读全文
hdu3564(Another LIS)(线段树)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=3564(1)插入元素;求最长上升子序列。他人具体代码:View Code #include<stdio.h>#include<string.h>#define lowbit(i) (i&(-i))const int MAXN=100005;const int MAXLOG=17;int B[MAXN],pos[MAXN];int N;void update(int i,int value){ //维护空位的个数 for(;i<=N;i+=lowbit(i)) B[i]+=
阅读全文
poj2378(Tree Cutting)(动态规划)
摘要:http://poj.org/problem?id=2378他人具体代码:View Code #include<cstdio>#include<vector>#include<cstring>using namespace std;const int maxn = 10010;vector<int> edge[maxn];int sum[maxn],ans[maxn],n;void dfs(int u,int fa){ sum[u]=1; int i,j; bool flag=true; for(i=0;i<edge[u].size();i
阅读全文
poj2482(Stars in Your Window)(线段树)
摘要:http://poj.org/problem?id=2482(1)普通的线段树问题。他人具体代码:View Code #include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#define ls rt<<1#define rs rt<<1|1#define lson l,m,ls#define rson m+1,r,rsusing namespace std;const int mm=11111;const int mn=mm<<
阅读全文
poj2155(Matrix)(树状数组)
摘要:http://poj.org/problem?id=2155题意:一个矩阵元素均为0,1, 快速更新指定的子矩阵,快速询问的是一个点。他人具体代码:View Code #include <iostream>#include <cstdlib>#include <cstring>#include <cstdio>using namespace std;#define maxn 1005int c[maxn][maxn];int Row, Col;inline int Lowbit(const int &x){ return x &
阅读全文
hdu4360(As long as Binbin loves Sangsang)(线段树)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4360已经很久没有碰ACM了,今后的很长一段时间也不会自己写一遍题了。有只是一天一题的小小思考,不会有多大的提高,只不过想借此来探寻自己还有多少为止的领域,以便于重新做题时能比较快地找到自己的方向。所以,这里之后的绝大部分代码都不是自己写的,而是留给自己看的。有几个注意点:(1)以L-O-V-E为走路方向的实现方法(数字化);(2)在求出最短路径的情况下,如何得到最多的LOVE数目;(3)对线段树代码的熟悉程度。他人具体代码:View Code #include <iostream> #inclu
阅读全文
poj 2528 Mayor's posters(线段树+离散化)
摘要:http://poj.org/problem?id=2528(1)给定一条线段,依次在上面覆盖一些线段(左右位置已给定),求最终能看到的线段数(看到一部分也算)。 本题的本质和染色问题一样,成段染色,延迟更新。(2)有一个难点在于,所给定的区域是1到1000万,不可能开这么大的数组。况且,用于覆盖的线段只有1万条。 这里用到了离散化方法,简化了问题,压缩了数组的大小(具体情况见代码)。(3)傻到开了一个pos[]数组,准备用来表示谁映射到谁。。(很无语,当时没有注意pos[]数组要开到1000万这么大)。(4)在写travel()函数时,忘了加上pushdown()。(5)思路点拨: 1...
阅读全文
浙大月赛C题(2012/8)Cinema in Akiba(线段树)
摘要:http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=4791(1)第一次写浙大的题目,这题让我十分意外,基本的线段树类型(求第x个空位)。(2)电影院里,一次插入一个人,让他坐在第x个空位shang(每个x均给定)。求最终的位置安排(制定一些人,求他们各自的座号)。具体代码:View Code #include<stdio.h>#define lson l, m, rt<<1#define rson m+1, r, rt<<1|1const int maxn=51000;int
阅读全文
hdu 1698 Just a Hook (线段树,延迟操作)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1698(1)简单的延迟操作。具体代码:View Code #include<stdio.h>#define lson l, m, rt<<1#define rson m+1, r, rt<<1|1const int maxn=101000;int t, n, m;int mark[maxn<<2], sum[maxn<<2];void pushdown(int rt, int n){ if(mark[rt]) { mark[rt<<1]=
阅读全文
hdu 2852 KiKi's K-Number (线段树,求大于x的第k小数)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2852(1)求比x大的第k个最小值。问题可以分解为两个子问题: 1)求不大于x 的数的个数t。(本质为求和) 2)求树里头的第t+y个数的值。(本质为定位)(2)考虑过直接计算出结果:search(y, x, n, 1); 即在区间(x, n)中寻找第y个数。 这种思想是可行的,但不适合已经构建的这棵树。因为已有的线段树只能从区间(1, 某数)开始查询,区间(x, n)与sum[]数组的描述方式对不上号。 (原有的sum[]数组中可能不含描述区间(x, n)的sum[i],并且一般情况下就是不包含对...
阅读全文
hdu 2711 Lost Cows(线段树,反序更新)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2711(1)又是一道从后往前更新的题目,该算法确实经典。(2)新亮点:用到了变量pos求ans[i];另外,用search()函数单独处理ans[1]。具体代码:View Code #include<stdio.h>#define lson l, m, rt<<1#define rson m+1, r, rt<<1|1const int maxn=81000;int n;int data[maxn], sum[maxn<<2];int ans[maxn];voi
阅读全文
hdu 1556 Color the ball (线段树,延迟更新)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1556(1)延迟更新:pushdown()函数,记得在所有的查询、更新函数中都要使用到。这里用到懒惰标记mark[]数组。(2)很基础的题,1A。具体代码:View Code #include<stdio.h>#define lson l, m, rt<<1#define rson m+1, r, rt<<1|1const int maxn=101000;int n;int mark[maxn<<2], sum[maxn<<2];void pushd
阅读全文
hdu 3564 Another LIS (线段树sum+二分查找)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=3564(1)和今天刚做过的一道题十分相似(夜间插队问题hdu2828),从后面起算,因为最后面的数的位置是固定的,而其他数的位置被其后面的树影响着。(2)一个易错点,在insert()函数中:if(p<=sum[rt<<1]) insert(p, val, lson);else insert(p-sum[rt<<1], val, rson); 注意每个字段的含义(sum[]数组是空位的个数,p是需要预留的空位数),很多时候不加思考,就写错成了: if(p<=m) inser
阅读全文
poj 2828 Buy Tickets (线段树sum)
摘要:http://poj.org/problem?id=2828(1)注意到,最后插队的人的位置是一定的,前一个人的位置的最终稳定取决于后面的所有人。为了避免插入一个新数时要挪出位置的尴尬,更为效率考虑, 可以从后往前插入树中(注意谁决定谁的关系的使用)。(2)小细节: 1) 0~n-1 而不是 1~n; 2)先输入,再更新(分开来); 3)希望今后的小错误可以尽快找出,线段树的写法虽然懂,但小错误最伤不起(很幼稚的类型,却很长时间才发现); 4)几乎所有的线段树都是求和、最值,但是各种包装下没能看清本质,还要多练手(题库里还有大约40题)。(3)对于每个插队的人(倒着数)...
阅读全文
hdu 4027 Can you answer these queries? (线段树+__int64)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4027又是纯粹的线段树的基本操作。(1)数组data[]是纯是浪费,不用开。数组sum[]在 build() 函数下应保证初始化成功(尤其是指先赋值为0,在读入数据)。(2)if(b>c) {int x=b;b=c;c=x;} 这关乎AC与否的问题。(3)稍微注意__int64 。(4)本题不需要成段更新(也没办法成段更新),更新时肯定会比较耗时。这里有个优化,当所考虑的区间里德只全为1(sum==r-l+1),就不需要更新了。if(sum[rt]==r-l+1) return ;具体代码:View C
阅读全文
hdu 2795 Billboard (线段树)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=2795(1)用到了线段树求最大值。线段树求最值、求和是两种重要工具,很多题目要以此为基石(很多时候第一眼看不出来要用上他们)。 本题的本质为求一段区间的最大值,每读入一个新的数据,都要递归地与该最大值判定,最底层时更新信息,得到结果。(2)线段树输入数据较多,不宜使用C++输入输出数据流(会超时的)。(3)多开了一个数组,没有赋初值,直接运算,但并没有对结果产生影响(独立的变量,不影响其他数的值),结果判定为WA。。。(4)注意到一个优化:h=min(h, n);否则要开一个1亿的数组,显然是不现实的。具..
阅读全文
poj 3468 A Simple Problem with Integers (线段树)(*****)
摘要:http://poj.org/problem?id=3468(1)求和的线段树,注意某些数据用__int64 类型,这里用到了延迟操作(事先打标记,时候用到时处理),即 pushdown 和 mark数组 的使用。(2)为什么我的代码吃吃未能通过。。。通过的代码:View Code #include <stdio.h>#include <string.h>#include <algorithm>using namespace std;typedef struct{ int l,r,lazy; long long num,tag;}Tree;Tree tree
阅读全文
hdu 4000 (Fruit Ninja )(树状数组+数学知识)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4000(1)核心算法:插入一个数 x ,求已插入的比 x 小的数的个数。(2)核心数学知识:要求的满足 i<j<k && x<z<y 的(x, y, z)的组数。下面简写数学小知识:x<z<y = x<y?z - x<y<z; 其中,y?z 表示 y, z 的大小没有确定。更多的数学处理详见代码。(3)考虑过更新时是update(a-1),还是update(a),这取决于更新和调用的顺序,顺序变了,代码自然变了一点点。这里附上代码2,一边比
阅读全文
poj 2481 Cows(树状数组)
摘要:http://poj.org/problem?id=2481(1)对树状数组不熟练,但本题是最基本的树状数组。(2)和星星那题本质一样,求比 x 大的其他已经入树的 x 的个数。只是多了一个排序处理 而已。(3)之前没有进行排序,工作量特别大,效率很低,而且变量特别多,理解起来也比较吃力。 所以,排序处理是十分必要的。这里附上超时的代码。具体代码:View Code #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;const int maxn=101000;i
阅读全文
hdu 1394 Minimum Inversion Number (线段树求逆序数)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1394(1)先构造一棵线段树(初始化),然后按先后顺序依次处理每一个数。对每一个数需要两种操作: 1)查询已经入树的比该数大的数的个数; 2)将该数插入到线段树中。 (2)尝试过将1)和2)合并,只写一个函数,AC了。详细操作见代码2 。具体代码:View Code #include<stdio.h>#include<string.h>#include<algorithm>#define lson l, m, rt<<1#define rson m+1, r,
阅读全文
|
|