题目链接:戳这里

题意:从(1,1)出发,一遍把格子走完,每个格子只能走一次。问怎么走总和最大。

解题思路:画图可知,总共就3种走法的混合。

dw: 样例1的走法

up: 样例1反过来的走法

lp: 样例2的走法

两种组合情况:

先lp,后dw或up

我的思路是暴力预处理。把dw,up,lp三种走法先预处理出来,然后再看两种组合情况的拐点在哪,遍历拐点求出最大的值即可。虽然代码很长,但大多数都是重复代码,思路还是很简单的。

附ac代码:

 1 #include <cstdio>
2 #include <cstring>
3 #include <string>
4 #include <algorithm>
5 #include <cmath>
6 #include <vector>
7 #include <queue>
8 #include <iostream>
9 using namespace std;
10 typedef long long ll;
11 const int maxn = 1e6 + 10;
12 ll nu[3][maxn];
13 ll dw[3][maxn];
14 ll up[3][maxn];
15 ll lp[3][maxn];
16 ll sumup[3][maxn];//单纯的前缀和,用于处理混合情况时up里的时间
17 ll sumdw[3][maxn];//如上
18 int dx[6] = {1, 0,-1, 0};
19 int dy[6] = {0, 1, 0, 1};
20 int main(){
21 int n;
22 scanf("%d", &n);
23 for(int i = 1; i <= 2; ++i)
24 {
25 for(int j = 1; j <= n; ++j)
26 {
27 scanf("%lld", &nu[i][j]);
28 }
29 }
30 for(int i = 1; i <= n; ++i)
31 {
32 up[2][i] += nu[2][i] * i + up[2][i - 1];
33 sumup[2][i] += nu[2][i] + sumup[2][i - 1];
34 }
35 up[1][n] += up[2][n];
36 sumup[1][n] += sumup[2][n];
37 for(int i = n ; i >= 2; --i)
38 {
39 up[1][i] += nu[1][i] * (2 * n - i + 1) + up[1][i + 1];
40 sumup[1][i] += nu[1][i] + sumup[1][i + 1];
41 }
42 for(int i = 2; i <= n; ++i)
43 {
44 dw[1][i] += nu[1][i] * (i - 1) + dw[1][i - 1];
45 sumdw[1][i] += nu[1][i] + sumdw[1][i - 1];
46 }
47 dw[2][n] += dw[1][n];
48 sumdw[2][n] += sumdw[1][n];
49 for(int i = n; i >= 1; --i)
50 {
51 dw[2][i] += nu[2][i] * (2 * n - i) + dw[2][i + 1];
52 sumdw[2][i] += nu[2][i] + sumdw[2][i + 1];
53 }
54 int u = 1, v = 1;
55 int cnt = 0;
56 while(u <= 2 && v <= n)
57 {
58 for(int i = 0; i < 4; ++i)
59 {
60 ++cnt;
61 u += dx[i];
62 v += dy[i];
63 if(u > 2 || v > n) break;
64 lp[u][v] = lp[u - dx[i]][v - dy[i]] + nu[u][v] * cnt;
65 }
66 }
67 ll ans = 0;
68 for(int i = 1; i <= n; i += 2)
69 {
70 ans = max(ans, lp[1][i] + (i / 2 * 2) * (sumdw[2][i] - sumdw[1][i]) + dw[2][i] - dw[1][i]);//临界值不清楚的同学自己画图跑跑就知道啦
71 }
72 for(int i = 2; i <= n; i +=2)
73 {
74 ans = max(ans, lp[2][i] + (i - 2) * (sumup[1][i] - sumup[2][i]) + up[1][i] - up[2][i]);
75 }
76 printf("%lld\n", ans);
77 return 0;
78 }

codeforces 1016C - Vasya And The Mushrooms 【构造 + 思维】的更多相关文章

  1. CodeForces - 1016C Vasya And The Mushrooms

    题面在这里! 好久没有体会这种A题的快感了23333 一开始看错了,以为权值是从1开始的,不过这样不要紧,最后把算的答案减去两行数的和就是正确的答案了. 然后发现位于一个角上的时候,我们其实只有两种选 ...

  2. codeforces C. Vasya And The Mushrooms (思维+模拟)

    题意:给定一个2*n的矩形方格,每个格子有一个权值,从(0,0)开始出发,要求遍历完整个网格(不能重复走一个格子),求最大权值和,(权值和是按照step*w累加,step步数从0开始). 转载: 题解 ...

  3. Codeforces Round #546 (Div. 2) D 贪心 + 思维

    https://codeforces.com/contest/1136/problem/D 贪心 + 思维 题意 你面前有一个队列,加上你有n个人(n<=3e5),有m(m<=个交换法则, ...

  4. CodeForces - 837E - Vasya's Function | Educational Codeforces Round 26

    /* CodeForces - 837E - Vasya's Function [ 数论 ] | Educational Codeforces Round 26 题意: f(a, 0) = 0; f( ...

  5. Vasya And The Mushrooms CodeForces - 1016C (前缀和模拟)

    大意: 给定2*n的矩阵, 每个格子有权值, 走到一个格子的贡献为之前走的步数*权值, 每个格子只能走一次, 求走完所有格子最大贡献. 沙茶模拟打了一个小时总算打出来了 #include <io ...

  6. Educational Codeforces Round 48 (Rated for Div. 2) D 1016D Vasya And The Matrix (构造)

    D. Vasya And The Matrix time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  7. codeforces1016 D. Vasya And The Matrix(思维+神奇构造)

    D. Vasya And The Matrix time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  8. Codeforces 755E:PolandBall and White-Red graph(构造+思维)

    http://codeforces.com/contest/755/problem/E 题意:给出n个点和一个距离d,让你在这个n个点的图里面构造一个子图,使得这个子图的直径和补图的直径的较小值为d, ...

  9. codeforces 454 E. Little Pony and Summer Sun Celebration(构造+思维)

    题目链接:http://codeforces.com/contest/454/problem/E 题意:给出n个点和m条边,要求每一个点要走指定的奇数次或者是偶数次. 构造出一种走法. 题解:可能一开 ...

随机推荐

  1. LSM(Log Structured Merge Trees ) 笔记

    目录 一.大幅度制约存储介质吞吐量的原因 二.传统数据库的实现机制 三.LSM Tree的历史由来 四.提高写吞吐量的思路 4.1 一种方式是数据来后,直接顺序落盘 4.2 另一种方式,是保证落盘的数 ...

  2. python爬虫如何提高效率

    开启线程池: 线程池 asyncio 特殊的函数 协程 任务对象 任务对象绑定 事件循环 from multiprocessing.dummy import Pool map(func,alist): ...

  3. JS获取本机地址,生成地图

    dome代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  4. Transparent Gateway的使用方法

    前言 使用Transparent Gateway(透明网关),建立ORACLE与SQLServer的连接. 实现功能:在ORACLE中查询SQLServer数据库的内容. 注:网上有ORACLE和SQ ...

  5. 报错:java.lang.ClassNotFoundException: io.opentracing.util.GlobalTracer

    报错:java.lang.ClassNotFoundException: io.opentracing.util.GlobalTracer 近来在做一个在线教育的项目,课程信息放在数据库,而视频放在阿 ...

  6. 那些我们不知道的 Python 免费学习资料

    作者:小R编辑:AI 兔兔 Python 语言因为其易学,以及强大的功能,是很多刚开始学习编程的入门语言的选择之一. Python 语言被列入中小学教材后引起了越来越多人的关注. 希望孩子学习编程的家 ...

  7. Fody,告别烦人的INotifyPropertyChanged,最简方式实现通知!

    INotifyPropertyChanged 我不是针对谁,我是说在座的各位 相信所有学wpf的,都写过类似下面的代码: 实现INotifyPropertyChanged public class M ...

  8. how2j 仿天猫j2EE零散笔记

    1. 在servlet中拼接  :"http://localhost:8080/tmall/admin_property_list?cid=83"  这句话中的cid=83时, c ...

  9. 在项目中如何自定义的Eslint配置

    一.设置js风格的缩进为4个空格 在你的前端项目中找到.eslintrc.js文件,如图 module.exports = { root: true, parserOptions: { parser: ...

  10. linux shell 判断空字符串的几种方法!

    在书写linux shell 脚本我们经常会遇到,对一个字符串是否为空进行判断,下面我对几种常用的方法进行了一个总结: 1.-z判断 -z string True if the length of s ...