codeforces 148 div1

来源:互联网 发布:热重分析软件下载 编辑:程序博客网 时间:2024/05/29 03:04

A : 假设已经有了i个数了,而且没有一段连续的区间异或值为0,那么我们考虑加入第i+1个数有几种方法,显然,第 i+1个数不能等于以i结尾的所有连续区间的异或值,这样的话第i+1 个数就有2^m-(i+1)中取值,注意,0不能选,所以依次相乘即可

B:   将一个数列划分成两个数列,要求一个最大的f(i,j) - 最小的f(i,j)的最小值,f(i,j)是这样定义的:如果i j两个数在同一个数列中,f(i,j) = i+j,否则f(i,j) = i+ j + h;

如果h = 0,显然随便怎么放都是一样的,否则,我们要使最大值尽可能小,使最小值尽可能大

所以,有两种放法:一种是全部放到一边

另一种是 把a1 放到一边,其他全放到另一边,这样就能使得a[i]+a[j]+h的值尽可能的小了(假设a数组已经排好序),想仔细点就简单了

代码:http://codeforces.com/contest/238/submission/2509068

C:   树形DP,点数3000,关键是处理两个点之间的路径,因为都是从两个端点出发,所以可以定义这样的状态

dp[u][0] : 从u往上走 的最小代价

dp[u][1] : 从u的父亲往u走的最小代价

代价指的是u到根的代价

每次两种决策,水水的转移

代码 : http://codeforces.com/contest/238/submission/2505316