首页 > 其他分享 >CF1256E. Yet Another Division Into Teams 题解 单调队列优化dp

CF1256E. Yet Another Division Into Teams 题解 单调队列优化dp

时间:2022-10-06 20:23:56浏览次数:92  
标签:Division int 题解 Into long que front maxn pres

题目链接:https://codeforces.com/contest/1256/problem/E

将 \(n\) 个数分成若干队,每一队至少包含 \(3\) 个整数,每一队的代价是最大值与最小值只差,求所有队伍代价之和的最小值,以及分成的队伍的数量,以及每个数所在的队的编号。

解题思路:

就是比较简单的单调队列优化dp,主要是下面这个公式:

f[i] = min(f[j] - a[j+1]) + a[i]

但是因为还有一些额外数据要输出所以再加一些操作这道题目就解决了。

示例程序:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;

int n, p[maxn], team[maxn], sz[maxn], pres[maxn];
long long f[maxn];
deque<int> que;

struct Node {
    int a, p;
} a[maxn];

bool cmp(Node a, Node b) {
    return a.a < b.a;
}

// f[i] = min(f[j] - a[j+1]) + a[i]

long long cal(int p) {
    return f[p] - a[p+1].a;
}

int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i].a;
        a[i].p = i;
    }
    sort(a+1, a+1+n, cmp);
    for (int i = 3; i <= n; i++) {
        int pre = i - 3;
        if (pre != 1 && pre != 2) {
            while (!que.empty() && cal(que.back()) >= cal(pre)) que.pop_back();
            que.push_back(pre);
        }
        pres[i] = que.front();
        f[i] = cal(que.front()) + a[i].a;
        sz[i] = sz[que.front()] + 1;
    }
    for (int i = n; i; i = pres[i]) {
        for (int j = pres[i]+1; j <= i; j++)
            team[a[j].p] = sz[i];
    }
    cout << f[n] << " " << sz[n] << endl;
    for (int i = 1; i <= n; i++) cout << team[i] << " ";
    return 0;
}

标签:Division,int,题解,Into,long,que,front,maxn,pres
From: https://www.cnblogs.com/quanjun/p/16758385.html

相关文章

  • CF472D题解
    原题CF472DDesignTutorial:InversetheProblem思路概述题意分析给定一个\(n\)点无向图的两两点对之间距离,即经过最短路算法后的邻接矩阵,要求判断原图是否为一个......
  • Educational Round 30 题解
    ContestLink虽然是unrated,不过秉持着EducationalRound的传统,题还是挺不错的。A.ChoresProblemLink评价:善用STL。由于\(a\)已经排好序了,且\(x\le\min_{i=1......
  • CF1415D XOR-gun 题解 二分答案/贪心
    题目链接https://codeforces.com/problemset/problem/1415/D题目大意给定一个长为\(n\)的不降序列,每次操作可以任选相邻的两个数,并将这两个数替换为两个数按位异或的......
  • C语言基础笔试题解析
    题目在这里:​​c语言笔试面试大全,C语言基础笔试题_Thomas杨大炮的博客-CSDN博客t​​2.C语言程序的三种基本结构都有哪些呢?3. ​​递归调用​​和间接递归调用​​定义​......
  • CF1728A Colored Balls: Revisited 题解
    【题目传送门】思路因为球的总数为奇数,所以肯定会剩下一颗球,因此每次都往数量小的拿,那么最后剩下的球一定是最初数量最多的小球的编号。因为假设最多的少一颗,那么将可以......
  • NOIP2015 T3 乱作题解
    题目看起来好像不是很难啊,为什么我做不出来呢;1.暴力枚举枚举x,y,z的值,再判断是否符合条件;时间复杂度:\(\mathcal{O}(n^3)\)期望得分:\(20pts\)\(Code\):#includ......
  • CF870E题解
    题目大意给你平面上\(n(1\leqslantn\leqslant10^5)\)个点,给出他们的坐标\(x_i,y_i(-10^9\leqslantx_i,y_i\leqslant10^9)\)。对于每个点有三种操作:不进行任何操......
  • P2149 [SDOI2009] Elaxia的路线 题解
    首先考虑分别求出在两个人最短路上的边,这个就是用\(s\)跑一遍最短路,\(t\)跑一遍最短路,然后枚举边\((u,v)\),如果满足\((s\tou)+(u\tov)+(t\tov)=(s\tot)\)那么......
  • 第一道面试题 第一道困难题解答记录
    输入一个奇数n,输出一个由*构成的n阶实心菱形。输入格式一个奇数n。输出格式输出一个由*构成的n阶实心菱形。具体格式参照输出样例。数据范围1≤n≤99输......
  • 【题解】「AGC013D」Piling Up
    传送门题目大意:开始有\(n\)个黑白球在袋子中,但是不知道具体多少黑球白球,有\(m\)次操作,每次从袋子中先拿一个球,再放入一个黑球一个白球,再拿走一个球,求所有初始情况下......