CodeForces - 295(div 2)
A 题
大致题意:
给你M(1<=M<=10^5)种操作,每种操作都会有各自的Li,Ri,Di(1<=Li,Ri<=n 且 1<=Di<=10^5),表示将数组A从A[Li]一直到A[Ri]这段区间都加上Di。
A数组的长度为N(1<=N<=10^5) ,并有初值,输入中会给出A数组的初值。然后有K(1<=K<=10^5)个操作序列L,R,表示执行操作L~R,最后题目要你输出
A数组最后的值。
题解:
因为这些操作都是离线的操作,所以我们只要知道每种操作被执行的次数就可以了。于是暴力差分搞上去就行了。
B 题
大致题意:
给你一个N(1<=N<=300),然后给你一张N*N的表,表的第I行第J列表示从I这个节点到J这个节点有一条长度为map[i,j]的边。
然后再给你N个数,这些数都是图中节点的序号,数据保证每个节点的序号恰好都出现了1次,然后要你分别求出按顺序删除这N个点后的图中所有点对的距离和。
题解:
利用弗洛伊德的性质:最外层的循环相当于把节点一个一个加入图中,作为图中某些点对间路径的中转节点。
所以对于这道题我们只需要按照给出的删数顺序倒着来一个一个加入图中就可以了,每加入一个点就统计一次答案,统计答案时遍历整张图就可以了。
C 题
=========
大致题意:
给你一个N和一个K(1<=N<=50, 1<=K<=5000),然后是N个数Xi,表示有N个人,他们的体重为Xi,但是题目限制Xi只会等于50或100。
K代表一只船的最大载重。
现在的情景是这N个人在一条河的一边,他们有一条船,求这N个人过河最少要多少代价(把船从一边划到另一边算1次)和以最少代价过河的方案数对10^9+7取模后
的值。
题解:
设dis[x][y][boat]代表原来的岸上有x个体重为50的人,y个体重为100的人,有一条船在原来的岸上(其实boat不是0就是1),到结束状态dis[0][0][0]的
从状态dis[0][0][0]开始做最短路,每一步代价为1,故使用BFS,转移的时候只需要注意船上至少有一个人,重量不要超过k就好了。那么dis[][][]数组
最短距离。
求好了,从起始状态dis[n1][n2][1]到最终状态的最少渡河次数就能求出来了,其中n1代表原来有n1个体重为50的人,n2为原来用n2个体重为100的人。
然后求次数,dp就可以了。状态类似用dp[x][y][boat]表示到达某个状态的方案,对于下一个方案dp[i][j][!boat],
当且仅当dis[i][j][!boat] + 1 = dis[x][y][boat],船不为空,不超载时转移。 dp[i][j][!boat]+=dp[x][y][boat]*
(可以移动的体重为50的人选需要移动的体重为50的人的方案数)*(可以移动的体重为100的人选需要移动的体重为100的人的方案数)
不过实际上可以在求dis的时候直接倒着把dp也算了……
D 题 :
================
大致题意:
你有一个n*m大小的棋盘,n行,m列,行号列号都从1开始,行从上到下数到n,列从左到右数到m,棋盘的每一个格子可以是黑色或者白色。
当满足全部下述条件的时候,认为棋盘上出现了一个”Cave“:
1.存在一个线段[l,r] (1 <= l <= r <= n),使得l,l+1,l+2,...,r这些行都有且仅有两个黑色格子,其他行不存在黑色格子。
2.存在一个行号t (l <= t <= r),使得:
3.对于任意存在黑色格子的行r,把这行的黑色格子对应的列号和黑色格子之间的列号加入一个集合, 称之为S(r)。
4.任取t及t之上的两个有黑色格子的行,令上方的行为u,下方的行d,则S(u)是S(d)的子集。
5.任取t及t之下的两个有黑色格子的行,令上方的行为u,下方的行为d,则S(d)是S(u)的子集。
6.你要输出有多少染色的方案,使得棋盘出现一个“Cave”,答案模1000000007。
题解
暂无,待日后补上。
E题
大致题意:
两个操作
(1) id op 把id的位置+op
(2) id op 查询在【id,op】之间的所有的数的差
题解:
未完成。。