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

这次比赛前两题切得算比较快,可惜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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值