codeforces 704B - Ant Man [想法题]
题目链接: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 [想法题]的更多相关文章
- codeforces 704B - Ant Man 贪心
codeforces 704B - Ant Man 贪心 题意:n个点,每个点有5个值,每次从一个点跳到另一个点,向左跳:abs(b.x-a.x)+a.ll+b.rr 向右跳:abs(b.x-a.x) ...
- CodeForces - 665D Simple Subset 想法题
//题意:给你n个数(可能有重复),问你最多可以取出多少个数使得任意两个数之和为质数.//题解:以为是个C(2,n)复杂度,结果手摸几组,发现从奇偶性考虑,只有两种情况:有1,可以取出所有的1,并可以 ...
- CodeForces 111B - Petya and Divisors 统计..想法题
找每个数的约数(暴力就够了...1~x^0.5)....看这约数的倍数最后是哪个数...若距离大于了y..统计++...然后将这个约数的最后倍数赋值为当前位置...好叼的想法题.... Program ...
- HDU 4972 Bisharp and Charizard 想法题
Bisharp and Charizard Time Limit: 1 Sec Memory Limit: 256 MB Description Dragon is watching NBA. He ...
- HDU - 5806 NanoApe Loves Sequence Ⅱ 想法题
http://acm.hdu.edu.cn/showproblem.php?pid=5806 题意:给你一个n元素序列,求第k大的数大于等于m的子序列的个数. 题解:题目要求很奇怪,很多头绪但写不出, ...
- Codeforces#441 Div.2 四小题
Codeforces#441 Div.2 四小题 链接 A. Trip For Meal 小熊维尼喜欢吃蜂蜜.他每天要在朋友家享用N次蜂蜜 , 朋友A到B家的距离是 a ,A到C家的距离是b ,B到C ...
- You Are Given a Decimal String... CodeForces - 1202B [简单dp][补题]
补一下codeforces前天教育场的题.当时只A了一道题. 大致题意: 定义一个x - y - counter :是一个加法计数器.初始值为0,之后可以任意选择+x或者+y而我们由每次累加结果的最后 ...
- codeforces 1165F1/F2 二分好题
Codeforces 1165F1/F2 二分好题 传送门:https://codeforces.com/contest/1165/problem/F2 题意: 有n种物品,你对于第i个物品,你需要买 ...
- 【贪心】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的 ...
随机推荐
- [BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛)
[BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛) 题面 我们知道,从区间\([L,R]\)(L和R为整数)中选取N个整数,总共有\((R-L+1)^N\)种方案.求最大公约数 ...
- linux下安装msgpack,yar,phalcon
安装msgpack扩展 下载:http://pecl.php.net/package/msgpack cd /usr/local tar zxvf msgpack-0.5.5.tgz cd msgpa ...
- Python数据基础类型-新建列表
1,遍历列表 遍历列表的所有元素,对每个元素执行相同的操作.可使用for循环 magicians = ['alice','david','carolina'] for magician in magi ...
- Redis主从架构核心原理
Redis-Cluster工作原理: redis集群内置了16384个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果 ...
- 剑指offer-链表中环的入口结点-链表-python ***
题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 思路 第一步,用两个快慢指针找环中相汇点.分别用slow, fast指向链表头部,slow每次走一步,fast每次 ...
- C#GC垃圾回收和析构函数和IDisposable的使用
一,什么是GC 1,GC是垃圾回收器,一般来说系统会自动检测不会使用的对象或变量进行内存的释放,不需要手动调用,用Collect()就是强制进行垃圾回收,使内存得到及时的释放,让程序效率更高. 2,G ...
- nroff - 用 groff 模拟 nroff 命令
总览 (SYNOPSIS) nroff [ -h ] [ -i ] [ -mname ] [ -nnum ] [ -olist ] [ -rcn ] [ -Tname ] [ file... ] 描述 ...
- rest_framework框架的基本组件
快速实例 Quickstart 序列化 创建一个序列化类 简单使用 开发我们的Web API的第一件事是为我们的Web API提供一种将代码片段实例序列化和反序列化为诸如json之类的表示形式的方式. ...
- python引用库异常总结
一.导入import pandas.io.data as web 时报了"The pandas.io.data module is moved to a separate package & ...
- Java Annotation 刷课笔记(一)
1.什么是注解? 1.1.Annotation是从JDK5.0引入的新技术 1.2.Annotation的作用: 不是程序本身,可以对程序作出解释(这一点,和注释没什么区别) 可以被其他程序(比如编译 ...