题目链接:戳这里

题意:从(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. OGG类异常汇总

    1.启动ogg后,进程不ABEND也不向前走 原因:ogg启动后,会收集表的统计信息耗费大量时间,导致进程不往前走 解决:在参数文件中加入 SQLEXEC 'alter session set OPT ...

  2. USB限流IC,输入5V,输出5V,最大3A限流

    USB限流芯片,5V输入,输出5V电压,限流值可以通过外围电阻进行调节,PWCHIP产品中可在限流范围0.4A-4.8A,并具有过压关闭保护功能. 过压关闭保护: 如芯片:PW1555,USB我们一半 ...

  3. 小麦苗数据库巡检脚本,支持Oracle、MySQL、SQL Server和PG等数据库

    目录 一.巡检脚本简介 二.巡检脚本特点 三.巡检结果展示 1.Oracle数据库 2.MySQL数据库 3.SQL Server数据库 4.PG数据库 5.OS信息 四.脚本运行方式 1.Oracl ...

  4. LOJ10043

    题目描述 原题来自:HNOI 2002 Tiger 最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger 拿出了公司的账本,账本上记录了公司成 ...

  5. easy-ui的datagrid

    <div id="magazineGrid"></div> <script> $('#magazineGrid').datagrid({ hei ...

  6. hashCode、equals详解

    hash和hash表是什么? hash是一个函数,该函数中的实现就是一种算法,就是通过一系列的算法来得到一个hash值,这个时候,我们就需要知道另一个东西,hash表,通过hash算法得到的hash值 ...

  7. Spark-读写HBase,SparkStreaming操作,Spark的HBase相关操作

    Spark-读写HBase,SparkStreaming操作,Spark的HBase相关操作 1.sparkstreaming实时写入Hbase(saveAsNewAPIHadoopDataset方法 ...

  8. mysql:如何利用覆盖索引避免回表优化查询

    说到覆盖索引之前,先要了解它的数据结构:B+树. 先建个表演示(为了简单,id按顺序建): id name 1 aa 3 kl 5 op 8 aa 10 kk 11 kl 14 jk 16 ml 17 ...

  9. 机器学习算法之Kmeans算法(K均值算法)

    Kmeans算法(K均值算法) KMeans算法是典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大.该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑 ...

  10. STL_优先队列

    一.简介 优先队列容器与队列一样,只能从队尾插入元素,从队首删除元素.但是它有一个特性,就是队列中最大的元素总是位于队首,所以出队时,并非按照先进先出的原则进行,而是将当前队列中最大的元素出队. 元素 ...