我是靠谱客的博主 苹果犀牛,最近开发中收集的这篇文章主要介绍Codeforces div.2 F - Trucks and Cities,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题意:给定一个数组,每个数值代表里起点的距离,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所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部