这次比赛前两题切得算比较快,可惜C题一直RE,比赛结束后2分钟就找出了错误,果然在系统判完后交了一下AC,心痛啊,编译器也很神奇,竟然没有出现RE,排序的地方出现了小问题,诶,长经验了。最后接近紫色1656,下次继续努力。
C 贪心
我的思路: 分别对行列处理。
行::把每行按一定规则排序, 规则如下:
1. 把 行中1的个数多的放到下面
2. 如果个数相同,比较最后一个1所在的列数,列数大的放在下面
然后根据排序后的情况推出交换行的过程。
列::把每行按一定规则排序, 规则如下:
1. 把 行中1的个数多的放到左边
2. 如果个数相同,比较最前一个1所在的列数,列数大的放在左面
然后根据排序后的情况推出交换列的过程。
D最短路+二分
n 200, 可以用O(n^3)过。
通过分析,发现距离的2倍必定是一个整数,我们不妨把所有的边都扩大两倍,方便处理。
先用floyd() 预处理出任意两点之间的距离。
这里距离有个单调性,即距离越大所能到达的节点越多,
所以我们二分距离, 对给定的距离判断是否合法,合法就保存。
这样就可以记录一个最短合法距离了。
E 线段树成段更新
节点可以保存 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)。
然后维护一下节点信息即可