概述
题意:给定一个数组,每个数值代表里起点的距离,m<2e5查询,s,f,c,r分别表示起点,终点,单位油耗及下标
思路:单调优化的决策dp
dpi,j,k :表示从i到j休息k次的休息,出发之间的最小连续行驶里程,400^4暴力dp
for(i,1,n)
for(j,i+1,n){
dp[i][j][0]=a[j]-a[i];
for(k,1,j-i+1){
dp[i][j][k]=a[i]-a[n];
for(l,j+1,i){
dp[i][j][k]=max(dp[i][j][k],min(dp[i][l][k-1],a[j]-a[l]);
}
}
}
出题人400恶意卡暴力枚举!!
无奈优化,其实很好想,因为dp优化无非就单调队列,滚动数组,还有类似完全背包的减维优化,预处理。
于是单调队列,滚动数组便派上用场了
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<algorithm>
#include<string>
#include<bitset>
#include<cmath>
#include<array>
#include<atomic>
#include<sstream>
#include<stack>
#include<iomanip>
//#include<bits/stdc++.h>
//#define int ll
#define pb push_back
#define endl 'n'
#define x first
#define y second
#define Endl endl
#define pre(i,a,b) for(int i=a;i<=b;i++)
#define rep(i,b,a) for(int i=b;i>=a;i--)
#define si(x) scanf("%d", &x);
#define sl(x) scanf("%lld", &x);
#define ss(x) scanf("%s", x);
#define YES {puts("YES");return;}
#define NO {puts("NO"); return;}
#define all(x) x.begin(),x.end()
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
typedef pair<int, PII> PIII;
typedef pair<char, int> PCI;
typedef pair<int, char> PIC;
typedef pair<double, double> PDD;
typedef pair<ll, ll> PLL;
const int N = 250020, M = 2 * N, B = N, MOD = 998244353;
const int INF = 0x3f3f3f3f;
const ll LLINF = 0x3f3f3f3f3f3f3f3f;
int dx[4] = { -1,0,1,0 }, dy[4] = { 0,1,0,-1 };
int n, m, k;
int a[N];
int dp[410][410];
vector<PIII> g[410];
ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
ll lowbit(ll x) { return x & -x; }
ll qmi(ll a, ll b, ll mod) {
ll res = 1;
while (b) {
if (b & 1) res = res * a % mod;
a = a * a % mod;
b >>= 1;
}
return res;
}
inline void init() {}
void slove()
{
int n, m;
si(n); si(m);
pre(i, 1, n) si(a[i]);
pre(i, 1, m)
{
int s, f, c, r;
si(s); si(f); si(c); si(r);
g[s].pb({ f, { c,r } });
}
ll ans = 0;
pre(i, 1, n)
{
pre(j, i + 1, n)
{
dp[j][0] = a[j] - a[i];
int pos = 0;
pre(k, 1, n)
{
dp[j][k] = a[j] - a[i];
while (pos < j && dp[pos + 1][k - 1] < a[j] - a[pos + 1])pos++;
dp[j][k] = min(dp[j][k], min(a[j] - a[pos], dp[pos + 1][k - 1]));
}
}
for (PIII u : g[i])
{
int f = u.x, c = u.y.x, r = u.y.y;
ans = max(ans, 1ll*dp[f][r] * c);
}
}
cout << ans << endl;
}
signed main()
{
int _;
//si(_);
_ = 1;
init();
while (_--)
{
slove();
}
return 0;
}
最后
以上就是苹果犀牛为你收集整理的Codeforces div.2 F - Trucks and Cities的全部内容,希望文章能够帮你解决Codeforces div.2 F - Trucks and Cities所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复