Good Bye 2014

来源:互联网 发布:趣头条提现是骗局 知乎 编辑:程序博客网 时间:2024/04/30 16:02

B.给你一个n,然后一个1-n的排列,然后一个n*n0,1矩阵,如果mp[i][j]==1,那么表示ij是可交换的,求最后可交换得到的序列的字典序最小是最多少。(n<=300)

 

思路:

这个题类似于冒泡排序,如果几个点之间是能够相互到达的,那么这几个点的序列可以为原来这几个点的任意排序。

所以我们只要判断哪几个点之间是相互可到达的(利用并查集或者forld),然后逐步去最优就可以了。



C.

n500)本书,成一摞。 我们有一个看书的顺序。 要看第i本书的时候,

我们要——

1,把这本书之上的书搬走,体力成本加上这本书之上的书的重量之和,再放回之上的所有书(不改变顺序);

2,看这本书,把这本书放在最上面。

问你初始的书从上到下的顺序可以是怎么样,能够使得我们的体力成本最小

 

 

思路:

显然,我们书的初始摆放顺序就按照我们看书的顺序就好了。 否则,我们还要浪费多余成本的调整成这个样子。

那么接下来的问题便是怎么求每一步需要搬的书的值了,我们只需要往前找一个和它相同的书,然后这两个之间的书都是需要搬动的。



D.

n1e5)个城市和n-1条边,构成一棵树。

同时我们会有q1e5)次修改操作。

对于每次操纵,我们把一条边的边权减小。

每次操作之后,我们任意选3个点,问你这三个点之间3条路径的距离之和的期望是多少。

 

思路:

我们不妨以1为树根,然后研究每条边。

我们可以通过dfs,得到每条边的上下各有多少个点。

假如说在一条边i的上面有up[i]个点,下面有dn[i]个点。

那么,我们就有C(up[i],1)*C(dn[i],2)+C(up[i],2)*C(dn[i],1)种方案选到这条边,又因为任意的三个点会经过这条边两次,所以答案需要乘以2

 

需要注意的地方:

这样计算,答案会爆long long,所以我们需要用double

或者可以约去一个n-3


E.

给你n2e5)块多米诺骨牌。

每个骨牌i都有其摆放的位置p[i]和高度l[i]1<=p[i],l[i]<=1e9)。

我们保证p[1]<p[2]<...<p[n]

 有q个询问,对于每个询问(xy

问你,假设我们推倒第x块多米诺骨牌,最少需要多少成本才能打到第y块骨牌。

 

这里的成本被定义为——

如果我们不对骨牌进行调整,就可以使得推xy,那么成本为0.

否则,我们可以选择对任意骨牌+任意高度,并使得推xy

最后的成本就是我们加上去的高度之和。

询问之间相互独立。

 

 

思路:

我们从左向右扫描,枚举到i的时候,处理所有询问右界为i的询问。

这样,我们在处理右界为i的询问之前,把左界为[1,i)都纳入了考虑范围。

 

我们发现一个性质,就是如果一个点之前的p[]+l[]<=它,而且这个点又已经确定被推倒了,那么之前点就没有任何意义。

于是,我们维护一个单调栈,使得栈底到栈顶元素的p[]+l[]是单调递减的。

 

假设,我们已经维护了所有骨牌想推倒第i-1个骨牌的成本。

现在,我们想要推倒第i个骨牌了,对于右界为i的询问,推的起点即左界,可能是[1,i-1)中的任何一个。

 

我们发现——

如果栈顶元素xp[x]+l[x]>=p[i],那么,因为之前的点都是可以确定推倒x的,于是必然也可以推倒i,无多余成本增加。

而如果栈顶元素xp[x]+l[x]<p[i],那么,假设sta[top-1]y,便有:[y+1,x]范围的数,都要增加一个p[i]-(p[x]+l[x])的成本才行。同时为了算之前栈中元素的费用,同时维护单调栈,必然退栈。

 

这里涉及到更新区间答案的操作,我们可以用线段树实现。

每个点最多入栈出栈一次,查询数量mlogn,修改数量nlogn,可以AC 




0 0