题目链接:http://codeforces.com/problemset/problem/704/B

--------------------------------------------------------------------------------

比赛时最远也就猜到了拆公式,算贡献这一步 然后就$GG$了

结束后问了$Randolph87$ 他给了一个"括号匹配"的思路

感觉这个思路比官方题解更可做 然后我就按照这个思路开始思考

对于非起点非终点外的所有点 有这四种情况

左入左出 左入右出 右入左出 右入右出

每当加入一个新的点

如果它是右入右出则当前区间的入度 $+1$ 出度 $+1$

如果是左入左出则当前区间的入度 $-1$ 出度 $-1$

另外两种情况则是入度出度都不改变

(此处度数是对于整个区间讲的 或者说这个区间对应的有向图还需要增加$x$个入度和$y$个出度才能构成一个环)

假设题目不限定起点终点 只要求一个回路 那么对于所有的点都这样做

并且保证中间状态中入度出度都为正数 最终状态入度出度都为$0$即可

然而题目是有起点和终点限制的一条路径

因此我们可以强行连一条从终点出从起点入的代价为$0$的边

.

.

.

按照这个思路做下去 一部分人会$WA5$

原因是在实现的时候 有可能只是限定了终点有一条方向向着起点的边

于是中间还可能混入其他的点 并没有保证终点和起点的直接连接

为了满足这个要求 我们可以在扫描到起点和终点之间的点的时候

强行使得 入度$-1(s < e$时$)$ / 出度 $-1(s > e$时$)$

这样就可以把这一部分完美地解决了

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int N = ;
long long f[N][N];
bool valid[N][N];
int x[N], a[N], b[N], c[N], d[N];
int n, s, e;
void update(long long &x, long long y, bool &z)
{
if(!z)
{
z = ;
x = y;
return;
}
x = min(x, y);
}
int main()
{
scanf("%d%d%d", &n, &s, &e);
for(int i = ; i <= n; ++i)
scanf("%d", &x[i]);
for(int i = ; i <= n; ++i)
scanf("%d", &a[i]);
for(int i = ; i <= n; ++i)
scanf("%d", &b[i]);
for(int i = ; i <= n; ++i)
scanf("%d", &c[i]);
for(int i = ; i <= n; ++i)
scanf("%d", &d[i]);
valid[][] = ;
int delta = ;
for(int i = ; i <= n; ++i)
{
if(i == min(s, e))
delta = s < e ? : -;
else if(i == max(s, e))
delta = ;
if(i != s && i != e)
for(int j = ; j <= i && j <= n - i; ++j)
{
if(j && valid[i - ][j - ])
update(f[i][j], f[i - ][j - ] + b[i] + d[i] - x[i] * , valid[i][j]);
if((j || i == n) && valid[i - ][j + ])
update(f[i][j], f[i - ][j + ] + a[i] + c[i] + x[i] * , valid[i][j]);
if(j && valid[i - ][j])
{
if(j > || !delta)
update(f[i][j], f[i - ][j] + min(a[i] + d[i], b[i] + c[i]), valid[i][j]);
else if(delta == )
update(f[i][j], f[i - ][j] + a[i] + d[i], valid[i][j]);
else
update(f[i][j], f[i - ][j] + b[i] + c[i], valid[i][j]);
}
}
else if(i == s)
for(int j = ; j <= i && j <= n - i; ++j)
{
if(s < e && j && valid[i - ][j - ])
update(f[i][j], f[i - ][j - ] + d[i] - x[i], valid[i][j]);
if(s < e && j && valid[i - ][j])
update(f[i][j], f[i - ][j] + c[i] + x[i], valid[i][j]);
if(s > e && (j || i == n) && valid[i - ][j + ])
update(f[i][j], f[i - ][j + ] + c[i] + x[i], valid[i][j]);
if(s > e && j && valid[i - ][j])
update(f[i][j], f[i - ][j] + d[i] - x[i], valid[i][j]);
}
else
for(int j = ; j <= i && j <= n - i; ++j)
{
if(s < e && (j || i == n) && valid[i - ][j + ])
update(f[i][j], f[i - ][j + ] + a[i] + x[i], valid[i][j]);
if(s < e && j && valid[i - ][j])
update(f[i][j], f[i - ][j] + b[i] - x[i], valid[i][j]);
if(s > e && j && valid[i - ][j - ])
update(f[i][j], f[i - ][j - ] + b[i] - x[i], valid[i][j]);
if(s > e && j && valid[i - ][j])
update(f[i][j], f[i - ][j] + a[i] + x[i], valid[i][j]);
}
}
printf("%lld\n", f[n][]);
return ;
}

codeforces 704B - Ant Man [想法题]的更多相关文章

  1. codeforces 704B - Ant Man 贪心

    codeforces 704B - Ant Man 贪心 题意:n个点,每个点有5个值,每次从一个点跳到另一个点,向左跳:abs(b.x-a.x)+a.ll+b.rr 向右跳:abs(b.x-a.x) ...

  2. CodeForces - 665D Simple Subset 想法题

    //题意:给你n个数(可能有重复),问你最多可以取出多少个数使得任意两个数之和为质数.//题解:以为是个C(2,n)复杂度,结果手摸几组,发现从奇偶性考虑,只有两种情况:有1,可以取出所有的1,并可以 ...

  3. CodeForces 111B - Petya and Divisors 统计..想法题

    找每个数的约数(暴力就够了...1~x^0.5)....看这约数的倍数最后是哪个数...若距离大于了y..统计++...然后将这个约数的最后倍数赋值为当前位置...好叼的想法题.... Program ...

  4. HDU 4972 Bisharp and Charizard 想法题

    Bisharp and Charizard Time Limit: 1 Sec  Memory Limit: 256 MB Description Dragon is watching NBA. He ...

  5. HDU - 5806 NanoApe Loves Sequence Ⅱ 想法题

    http://acm.hdu.edu.cn/showproblem.php?pid=5806 题意:给你一个n元素序列,求第k大的数大于等于m的子序列的个数. 题解:题目要求很奇怪,很多头绪但写不出, ...

  6. Codeforces#441 Div.2 四小题

    Codeforces#441 Div.2 四小题 链接 A. Trip For Meal 小熊维尼喜欢吃蜂蜜.他每天要在朋友家享用N次蜂蜜 , 朋友A到B家的距离是 a ,A到C家的距离是b ,B到C ...

  7. You Are Given a Decimal String... CodeForces - 1202B [简单dp][补题]

    补一下codeforces前天教育场的题.当时只A了一道题. 大致题意: 定义一个x - y - counter :是一个加法计数器.初始值为0,之后可以任意选择+x或者+y而我们由每次累加结果的最后 ...

  8. codeforces 1165F1/F2 二分好题

    Codeforces 1165F1/F2 二分好题 传送门:https://codeforces.com/contest/1165/problem/F2 题意: 有n种物品,你对于第i个物品,你需要买 ...

  9. 【贪心】Codeforces 704B & 705D Ant Man

    题目链接: http://codeforces.com/problemset/problem/704/B 题目大意: 给N个点,起点S终点T,每个点有X,A,B,C,D,根据I和J的X坐标可得I到J的 ...

随机推荐

  1. Selenium1.0与2.0介绍

    Selenium的实现原理 首先,你要明确刚才建立的测试用例是基于Selenium 2.0,也就是Selenium + WebDriver的方案.其次,你需要知道,对Selenium而言,V1.0和V ...

  2. [LeetCode] 47. 全排列 II

    题目链接 : https://leetcode-cn.com/problems/permutations-ii/ 题目描述: 给定一个可包含重复数字的序列,返回所有不重复的全排列. 示例: 输入: [ ...

  3. python3 pycurl 出现 TypeError: string argument expected, got 'bytes' 解决方案

    用pycurl请求指定链接并返回结果时出现 TypeError: string argument expected, got 'bytes'  错误 经过排查问题出现在使用StringIO的write ...

  4. ThinkPHP5 支付宝支付扩展库(超级简单,超级好用!)

    ThinkPHP5 支付宝支付扩展库, 一个静态方法的调用就可以实现,包括手机网站支付.电脑网站支付.支付查询.退款.退款查询.对账单所有功能,而且是2017年7月20日最新版~我的想法是,调用一个静 ...

  5. HTML面试问题收集(1)

    1.浏览器页面有哪三层构成,分别是什么,作用是什么? 构成:结构层.表示层.行为层分别是:HTML.CSS.JavaScript 作用:HTML实现页面结构,CSS完成页面的表现与风格,JavaScr ...

  6. Mysql 服务器管理程序 mysqladmin

    mysqladmin [oprions] command 选项                                      说明 create db_name               ...

  7. CentOS7 添加新用户并授权 root 权限

    参考文章:CentOS 7中添加一个新用户并授权 # root 用户操作 $ 普通用户操作 创建用户 # adduser USERNAME # passwd USERNAME (输入密码) 授权 ro ...

  8. 第二节,下载openwrt源码和编译环境

    文章的开始先说两个重点 1.不要使用root用户编译,普通用户编译即可. 2.自行搭建梯子,以免编译失败. 一,进入虚拟机内的Ubuntu系统 点击左下角的显示应用程序,我们去修改一下Ubuntu的源 ...

  9. 分页控件SSTab

    一.分页控件SSTab概述1.作用:采用分页形式查询或编辑数据表中数据.2.添加到控件箱菜单命令:工程 | 部件,选择:Microsoft Tabbed Dialog Control 6.0 (SP6 ...

  10. VB.net删除节点,数据库,文件

    Private Sub mnuDel_Click()'删除节点Dim sKey As String'Dim sFile As StringDim oFS As FileSystemObjectDim ...