Codeforces Round #163 (Div. 2) (完全)

来源:互联网 发布:js让金额不为0 编辑:程序博客网 时间:2024/05/18 02:22

这次比赛前两题切得算比较快,可惜C题一直RE,比赛结束后2分钟就找出了错误,果然在系统判完后交了一下AC,心痛啊,编译器也很神奇,竟然没有出现RE,排序的地方出现了小问题,诶,长经验了。最后接近紫色1656,下次继续努力。

C 贪心

我的思路: 分别对行列处理。

行::把每行按一定规则排序, 规则如下:

1. 把  行中1的个数多的放到下面

2. 如果个数相同,比较最后一个1所在的列数,列数大的放在下面

然后根据排序后的情况推出交换行的过程。

列::把每行按一定规则排序, 规则如下:

1. 把  行中1的个数多的放到左边

2. 如果个数相同,比较最前一个1所在的列数,列数大的放在左面

然后根据排序后的情况推出交换列的过程。

code

 

D最短路+二分

n  200, 可以用O(n^3)过。

通过分析,发现距离的2倍必定是一个整数,我们不妨把所有的边都扩大两倍,方便处理。

先用floyd() 预处理出任意两点之间的距离。

这里距离有个单调性,即距离越大所能到达的节点越多,

所以我们二分距离, 对给定的距离判断是否合法,合法就保存。

这样就可以记录一个最短合法距离了。

code

 

线段树成段更新

节点可以保存   ai* i^k的和 (l<= i <= r,i表示线段中的坐标)  这一信息。自然维护是很容易的。

但询问的时候,题目要的是 ai* (i-1+l)^k的和, 我们可以通过 ai* i^k的和 向其转化。

转化如下:

我们假设-l+1 = v, 表示偏移量,假设节点信息关于j(指数)的关系为F(j),则有


可见我们要用一个二维数组保存节点的信息(seg[6][maxn<<2])。

预处理出组合数C[0][0] ---- C[6][6], sum[j][i](表示 1^j+2^j+.......+i^j)。

然后维护一下节点信息即可

code

原创粉丝点击