题目链接: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. [BZOJ 3509] [CodeChef] COUNTARI (FFT+分块)

    [BZOJ 3509] [CodeChef] COUNTARI (FFT+分块) 题面 给出一个长度为n的数组,问有多少三元组\((i,j,k)\)满足\(i<j<k,a_j-a_i=a_ ...

  2. Codeforces 1255F Point Ordering(凸包+叉积)

    我们随机选取点1,2作为凸包的一个分割线,那么我们可以直接枚举剩下n-2个点找到他们和向量1-2的叉积大小与正负,然后我们可以根据叉积的正负,先将他们分割出两个区域,在向量1-2的下方还是上方,接下来 ...

  3. 通过编写串口助手工具学习MFC过程--(十一)弹出模态型对话框

    通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...

  4. wpf textbox ctrl+enter事件

    <TextBox x:Name="xcontent" Text="sfasdf" Grid.Row="0" AcceptsReturn ...

  5. Linux系统性能测试工具(五)——磁盘io性能工具之fio

    本文介绍关于Linux系统(适用于centos/ubuntu等)的磁盘io性能测试工具-fio.磁盘io性能测试工具包括: fio: dd

  6. 十大基本功之testbench

      1. 激励的产生 对于testbench而言,端口应当和被测试的module一一对应.端口分为input,output和inout类型产生激励信号的时候,input对应的端口应当申明为reg, o ...

  7. L3-016. 二叉搜索树的结构

    二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值:若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值:它的左.右子树也分别 ...

  8. django搭建一个小型的服务器运维网站-查看服务器中的日志与前端的datatable的利用

    目录 项目介绍和源码: 拿来即用的bootstrap模板: 服务器SSH服务配置与python中paramiko的使用: 用户登陆与session; 最简单的实践之修改服务器时间: 查看和修改服务器配 ...

  9. 关于web前端性能优化问题

    好久没有来博客写随笔了,可能是懒了吧,哈哈, 最近很想整理一篇关于前端性能优化的问题,毕竟能提高网站的观赏性对吧.提升网站性能,提升用户体验 那 什么是web性能优化? 可以这么理解:从用户访问资源到 ...

  10. sharepoint 2010 创建自定义的ASP.NET Web Service (上)

    项目背景 根据客户需求在SharePoint 2010 中创建自定义的ASP.NET Web Service可以分为3种方式(我所知道的).废话少说,下面一一列举: 创建方式 MSDN 官方博客自己的 ...