摘要:
解说传送门:http://neroysq.blogcn.com/articles/%E5%90%8E%E7%BC%80%E8%87%AA%E5%8A%A8%E6%9C%BA%E5%88%9D%E6%8E%A2.html应用传送门:http://neroysq.blogcn.com/articles/spoj%E5%90%8E%E7%BC%80%E8%87%AA%E5%8A%A8%E6%9C%BA%E5%BA%94%E7%94%A8.html 阅读全文
摘要:
WC回来后无论如何都忍不住搞动态树的冲动了,因为冬令营上各路神牛都讲动态树啊。 看了一下往年的论文,大概知道了动态树是什么东西——在树上利用平衡树来给暴力加速。代码还是比较好写的,没什么标记也就100行左右(当然这是水题级别的),于是刷了几道水题。1.QTREE 树上修改单边,询问路径上最大的边权。 找到lca后直接在两截splay上取个max。#include <stdio.h>#include <string.h>const int nmax = 10000, mmax = nmax * 2, oo = ~0U >> 1;int n, tot = 1, 阅读全文
摘要:
花了点时间做了一下CEOI2011,题目质量还是比较好的CEOI 2011 SolutionsDay11.Balloons 大意是很多有着固定的横坐标气球没有固定的半径,然后求从左到右依次吹这些气球,它们的半径最大是多少。(气球下端必须触地)因为气球的横坐标固定了,因此对于第i个气球,我们要使得它与前i-1个气球不相交,就可以推其最大半径的式子: dist(i, j) = sqrt((x[i] – x[j])^2 + (r[i] – r[j])^2) = r[i] + r[j] (j为与i相切的那个气球) 整理可得r[i] = (x[i] – x[j])^2 / (4 * r[j]) ... 阅读全文
摘要:
鉴于noip将近,我就把超纲的工作缩了一点水,本来要做一批题的,现在就只做了一个维护序列了:这道题目恶心啊,不理一下思路怕写不出来:由于是单旋splay,为了使操作方便,加了一个0节点和一个n + 1节点,由于0节点的特殊性,就把整个序列向右平移一个。0:初始化 一开始读入初始数列时,要把它们加入树,就先把它们预处理成一颗平衡树就好,于是从这里开始有了一个函数build(pos, l, r)表示把l到r这段建树,以pos为当前树的根,递归处理即可,最后递归回来不要忘记更新标记。1:插入 同样把读进来的数列先预处理成一颗平衡树,然后再把l这个节点splay到根,把l+1节点splay到l右边,此 阅读全文
摘要:
最近预计做一下各种平衡树的题,这是第一部分,就是一类简单的各种操作,由于实在是太简单了,各种数据结构都可以胜任,我就用treap和sbt分别做了一遍平衡树的三大水题,于是这两种数据结构就比较熟练了。 treap就是普通的二叉排序树多满足了一个堆的性质,相当好写,贴一贴三道题的代码:1.hnoi2002 turnover(无敌大水题)#include <stdio.h>#include <stdlib.h>#include <time.h>const int nmax = 32767;int ans, n, tot, root;struct typetreap 阅读全文
摘要:
有一类问题,它们的大意都是维护一段序列,给出两种操作,一种是对一段区间进行整体修改,一类是对一段区间询问其中元素的极值或者和。这一类问题通常是使用线段树来解的,然而,如果操作比较简单,线段树的实现也会有不同的方法,这里以最简单的一道题poj 3468为例。第一种方法:线段树 + lazy标记我们使用lazy标记维护当前节点的子区间是否有延后更新,我们知道如果对于每一次的区间修改都暴力做的话复杂度是O(n)的,我们想要把它减少到O(logn),于是对于一整段区间都需要修改的情况,我们可以就在这整段区间的代表节点记下这个区间需要改变的值,当我们需要深入这个区间时再将这个信息下放下取,运用这个思想就 阅读全文
摘要:
快速傅立叶变换FFT下面的排版比较乱,可以直接下word版的:http://minus.com/dbdrNFtIEL89Eb.docx;原理:利用多项式点值求积的便捷性。对于一个次数界为n的多项式A(x)= 然后我们对于这种多项式有很多表示方法,最常见的就是系数表示法(coefficientrepresentation),也就是我们定义一个向量a = (a0, a1,a2,…, an-1),通过向量a,我们就知道了这个多项式的所有系数,这样对于多项式与多项式就能进行运算了:1.多项式加法:A(x) + B(x) =C(x) 显然,C(x)的系数向量c = (a0+ b0, a1 + ... 阅读全文
摘要:
Pro 有n个盒子围成一个圆圈,我们把这些盒子顺时针从1到n(1 <= N <= 1000)编号。 在这些盒子里面有一些球,球的总数不大于n。 我们现在要进行若干次操作,使得每个盒子里面最多存在一个球。对于一次操作, 我们可以把一个球从它原先所在的盒子移到与它相邻的一个盒子里面。 请你编写一个程序:从输入数据中读取求得总数和每个盒子里球的具体个数,并且计 算出最少的操作数使得满足每个盒子中最多只有一个球Solution我们可以建立一个费用流模型解决这一道题,我们如果把每一个球当作一道流量为1的流, 那么如果我们建立一个汇点表示最终在盒子中的球的数目,那么显然这两个流量是... 阅读全文
摘要:
ProGAS gastask 给出一个n个节点的树,现在要在这棵树上放置一些指示物: 1.一个节点可以放置多个指示物; 2.一个指示物拥有一个笼罩范围,即与它本身所在节点的距离在k个节点之内的任何节点,它都可以选择笼罩 3.每个指示物最多笼罩s个不同的节点。 问题是使用最少的指示物将整棵树全部笼罩到。Solution题目给出了一棵树,可以比较容易地得到对于一个节点,我们找到一个从它这里可以覆盖到的最远的子节点,那么从它到这个子节点的路径上的每一个节点设立指示物都可以覆盖到这个子节点,那么从当前的这个节点设立应该是最优的,这样有没有可能有反例呢?我们假设这条路径中有某一个节点i的子树中有另一个节 阅读全文
摘要:
Pro 给你一个序列{A[1], A[2], ..., A[N]}.( |A[i]| ≤ 15007 , 1 ≤ N ≤ 50000 ) 给定“查询”操作的定义如下: Query(x,y) = Max { a[i]+a[i+1]+...+a[j] ; x ≤ i ≤ j ≤ y }. 给出M个查询,你的程序需要输出这些查询的结果。Input 输入文件的第一行包含一个整数n,表示给出的数的个数; 在第二行,给出N个数字,表示A[1]到A[n]; 第三行包含整数M,表示询问的个数; 接下来M行,每行包含两个数x和y.Output你的程序应该输出M个查询的结果,每个查询结果占一行。Sample In 阅读全文