想写一个 70 pts 算法,结果数据水,直接就切了

最短路:

// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;
#define setIO(s) freopen(s".in","r",stdin)
#define maxn 300000
#define ll long long
struct Node { int x,y,p,q; }nd[maxn];
vector<int>G1[maxn],G2[maxn];
map<int,int>date1[maxn],date2[maxn];
int n,m,A,B,C,cnt1,edges,cnt2;
int hd[maxn*10],to[maxn*10],nex[maxn*10];
ll val[maxn*10];
inline void addedge(int u,int v,ll c)
{
nex[++edges]=hd[u], hd[u]=edges, to[edges]=v,val[edges]=c;
}
inline ll calc(ll u) { return 1ll*A*u*u + 1ll*B*u + 1ll*C; }
int S,T;
int inq[maxn*10];
ll dis[maxn*10];
queue<int>Q;
inline void spfa()
{
for(int i=1;i<maxn*10;++i) dis[i]=1000000000000;
Q.push(S);
inq[S]=1;
dis[S]=0;
while(!Q.empty())
{
int u=Q.front(); Q.pop();
inq[u]=0;
for(int i=hd[u];i;i=nex[i])
{
int v=to[i];
if(dis[u]+val[i] < dis[v])
{
dis[v]=dis[u] + val[i];
if(!inq[v])
{
inq[v]=1;
Q.push(v);
}
}
}
}
printf("%lld\n",dis[T]);
}
int main()
{
int i,j;
// setIO("input");
scanf("%d%d%d%d%d",&n,&m,&A,&B,&C);
for(i=1;i<=m;++i)
{
scanf("%d%d%d%d",&nd[i].x,&nd[i].y,&nd[i].p,&nd[i].q);
G1[nd[i].y].push_back(nd[i].q);
G2[nd[i].x].push_back(nd[i].p);
if(!date2[nd[i].x][nd[i].p]) date2[nd[i].x][nd[i].p]=++cnt2;
if(!date1[nd[i].y][nd[i].q]) date1[nd[i].y][nd[i].q]=++cnt1;
}
for(i=1;i<=m;++i)
{
addedge(date2[nd[i].x][nd[i].p], date1[nd[i].y][nd[i].q] + cnt2, 0);
}
int k=0;
for(i=1;i<=n;++i)
{
if(!G1[i].size() || !G2[i].size()) continue;
for(j=0;j<G1[i].size();++j)
{
for(k=0;k<G2[i].size();++k)
{
if(G1[i][j]>G2[i][k]) continue;
addedge(date1[i][G1[i][j]] + cnt2, date2[i][G2[i][k]], calc(G2[i][k] - G1[i][j]));
}
}
}
S=0,T=cnt1 + cnt2 +100;
for(i=0;i<=1000;++i) if(date2[1][i]) addedge(S, date2[1][i], calc(i));
for(i=0;i<=1000;++i) if(date1[n][i]) addedge(date1[n][i] + cnt2, T, i);
spfa();
return 0;
}

  

$O(mt)$ DP (网上说这个做法在现场能切题)

#include<bits/stdc++.h>
#define setIO(s) freopen(s".in","r",stdin)
#define maxn 300001
#define inf 1000000000
using namespace std;
int n,m,A,B,C;
int f[maxn][1002];
int calc(int t)
{
return A*t*t+B*t+C;
}
struct Node{ int x,y,p,q; }nd[maxn];
bool cmp(Node a, Node b)
{
return a.p < b.p;
}
int main()
{
// setIO("input");
int i,j;
scanf("%d%d%d%d%d",&n,&m,&A,&B,&C);
for(i=1;i<=m;++i)
{
scanf("%d%d%d%d",&nd[i].x,&nd[i].y,&nd[i].p,&nd[i].q);
}
sort(nd+1,nd+1+m,cmp);
for(i=0;i<=n;++i) for(j=0;j<=1000;++j) f[i][j]=inf;
f[1][0]=0;
for(i=1;i<=m;++i)
{
for(j=0;j<=nd[i].p;++j)
{
if(f[nd[i].x][j]==inf) continue;
f[nd[i].y][nd[i].q] = min(f[nd[i].y][nd[i].q], f[nd[i].x][j] + calc(nd[i].p - j));
}
}
int ans=inf;
for(i=0;i<=1000;++i)
{
ans=min(ans, f[n][i] + i);
}
printf("%d\n",ans);
return 0;
}

  

luogu 5468 [NOI2019]回家路线 最短路/暴力的更多相关文章

  1. 【题解】Luogu P5468 [NOI2019]回家路线

    原题传送门 前置芝士:斜率优化 不会的可以去杜神博客学 这道题我考场上只会拆点跑最短路的70pts做法 后来回家后发现错误的爆搜都能拿满分(刀片) 还有很多人\(O(mt)\)过的,还是要坚持写正解好 ...

  2. Luogu P5468 [NOI2019]回家路线 (斜率优化、DP)

    题目链接: (luogu) https://www.luogu.org/problemnew/show/P5468 题解: 爆long long毁一生 我太菜了,这题这么简单考场上居然没想到正解-- ...

  3. [NOI2019]回家路线

    [NOI2019]回家路线 题目大意: 有\(n\)个站点,\(m\)趟车,每趟车在\(p_i\)时从\(x_i\)出发,\(q_i\)时到达\(y_i\). 若小猫共乘坐了\(k\)班列车,依次乘坐 ...

  4. NOI2019 回家路线 DP

    「NOI2019」回家路线 链接 loj 思路 f[i][j]第i个点,时间为j,暴力转移 复杂度O(m*t),好像正解是斜率优化,出题人太不小心了233 代码 #include <bits/s ...

  5. P5468 [NOI2019]回家路线 斜率优化 dp

    LINK:回家路线 (文化课 oi 双爆炸 对 没学上的就是我.(我错了不该这么丧的. 不过还能苟住一段时间.当然是去打NOI了 这道题去年同步赛的时候做过.不过这里再次提醒自己要认真仔细的看题目 不 ...

  6. [NOI2019]回家路线(最短路,斜率优化)

    终于把这鬼玩意弄完了-- 为什么写的这么丑-- (顺便吐槽 routesea) 最短路的状态很显然:\(f[i]\) 表示从第 \(i\) 条线下来的最小代价. 首先明显要把那个式子拆开.直觉告诉我们 ...

  7. P5468 [NOI2019]回家路线

    传送门 看题目一眼斜率优化,然后写半天调不出来 结果错误的 $dfs$ 有 $95$ 分?暴力 $SPFA$ 就 $AC$ 了? 讲讲正解: 显然是斜率优化的式子: 先不考虑 $q_{s_k}$ 的贡 ...

  8. 【斜率优化】【P5468】 [NOI2019]回家路线

    Description 给定 \(n\) 点,这 \(n\) 个点由 \(m\) 班列车穿插连结.对于第 \(i\) 班列车,会在 \(p_i\) 时刻从 \(x_i\) 站点出发开向 \(y_i\) ...

  9. Luogu P2149 [SDOI2009]Elaxia的路线(最短路+记忆化搜索)

    P2149 [SDOI2009]Elaxia的路线 题意 题目描述 最近,\(Elaxia\)和\(w**\)的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们必须合理地安排两个人在一起的 ...

随机推荐

  1. 【Linux开发】【DSP开发】利用CCS6.1生成out文件的同时生成bin文件

    [Linux开发][DSP开发]利用CCS6.1生成out文件的同时生成bin文件 标签:[DSP开发] [Linux开发] 尝试在windows上安装的CCS6.1开发AM4378-Linux下的应 ...

  2. PHPFPM模式三种运行模式

    1.static模式 static模式始终会保持一个固定数量的子进程,这个数量由pm.max_children定义.   2.dynamic模式 子进程的数量是动态变化的,启动时,会生成固定数量的子进 ...

  3. 通过proxychains实现Ubuntu终端代理

    1.在终端内使用代理,需要使用proxychains: sudo apt-get install proxychains 2.编辑 /etc/proxychains.conf sudo gedit / ...

  4. HashMap中确定数组位置为什么要用hash进行扰动

    HashMap数据存储的过程先根据key获得hash值,通过 (n - 1) & hash 判断当前元素存放的位置(这里的 n 指的是数组的长度),如果当前位置存在元素的话,就判断该元素与要存 ...

  5. Java——LinkedList底层源码分析

    1.简介 LinkedList 是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢.另外,他还提供了 List 接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈 ...

  6. 数位dp相关

    经典的数位Dp是要求统计符合限制的数字的个数. 一般的形式是:求区间[n,m]满足限制f(1). f(2). f(3)等等的数字的数量是多少. 条件 f(i) 一般与数的大小无关,而与数的组成有关. ...

  7. 各类最新Asp .Net Core 项目和示例源码

    1.网站地址:http://www.freeboygirl.com2.网站Asp .Net Core 资料http://www.freeboygirl.com/blog/tag/asp%20net%2 ...

  8. 一些DP上的奇奇怪怪的东西

    单调队列&单调栈: 有手就行.jpg 四边形不等式: 若\(w(i,j)\)满足\(\forall a\le b<c\le d,w(a,c)+w(b,d)\le w(b,c)+w(a,d ...

  9. Mysql中explain作用详解

    一.MYSQL的索引 1.索引(Index):帮助Mysql高效获取数据的一种数据结构.用于提高查找效率,可以比作字典.可以简单理解为排好序的快速查找的数据结构.2.索引的作用:便于查询和排序(所以添 ...

  10. linux查找进程id和杀死进程以及查看内存??

    ps 命令用于查看当前正在运行的进程 ps ax : 显示当前系统进程的列表 ps aux : 显示当前系统进程详细列表以及进程用户 -e 显示所有进程,环境变量 此参数的效果和指定"A&q ...