[CodeForces] 87

来源:互联网 发布:java 时间戳格式化 编辑:程序博客网 时间:2024/04/29 07:13

A BFS || DFS
B Greedy
开始的被hack了 : (
一个很2却很隐蔽的错误:
我默认了当前行的位置一定是在下一行的最左边的最左(右同理)
应该加上一个abs

C 观察 然后把图转化为

1 - 00 2 - 01 3 - 11 4 - 10

这样就会发现每一行,首位必须是 (0)101...

每一列,末位必须是 (0)101...

D 不难的DP,太弱了,最后20多分钟没想清楚

E 很熟悉,也很有意思的贪心 + 某数据结构维护

UPD: Refer to the 

Editorial

翻译一下就是:

用一个线段树维护 dp[i][j]

表示当前在第i条路上,修护了前j条路,得到的最大收益

这样可以更新dp[i+1][j+1]

首先把这段区间都加上修护第i+1条路的代价

然后按区间加上race满足条件得到的收益

对于一个race <si, ei, ci> 如果ei = i+1,则更新ei - si < k <= i 这段区间的值

再每次加入一个新节点,表示未修护第i+1条路的最优值

复杂度为 O(M logN)

int main() {    while (scanf ("%d%d", &n, &m) != EOF) {        rep(i,n) scanf ("%d", a + i);        rep(i,m) r[i].input();                sort (r, r + m);        st.build(0, n);                long long ans = 0;        int id = 0;        rep(i,n) {            st.update(0, i, -a[i]);            for (; id < m && r[id].e == i; ++id) {                st.update(0, r[id].s, r[id].c);            }            ans = max(ans, st.getMax());            st.update(i + 1, i + 1, ans);        }        printf ("%I64d\n", ans);    }    return 0;}


原创粉丝点击