首页 > 其他分享 >[lnsyoj2271/luoguP3745/省选联考 2017]期末考试

[lnsyoj2271/luoguP3745/省选联考 2017]期末考试

时间:2024-08-15 20:38:10浏览次数:13  
标签:lnsyoj2271 省选 max tt int le ULL cdot 联考

题意

给定长度为 \(n\) 的序列 \(t\) 和长度为 \(m\) 的序列 \(b\),以及常数 \(A,B,C\),可以进行两种操作:

  1. 选取任意 \(1 \le x,y \le n\),并使 \(b_x + 1,b_y-1\),记进行了 \(\alpha\) 次这种操作;
  2. 选取任意 \(1 \le z \le n\),并使 \(b_z - 1\),记进行了 \(\beta\) 次这种操作。

求进行若干次操作后,

\[\alpha \cdot A + \beta \cdot B + \sum_{i=1}^n \max\{0,- t_i + \max_{j=1}^m b_j\} \]

的最小值。

sol

我们可以枚举 \(\max_{j=1}^m b_j\) 的值 \(tt\),贪心地计算在这种情况下最小的 \(\alpha \cdot A + \beta \cdot B\),具体地,设 \(sumbr=\sum_{i=1}^n \max\{0, b_i - tt\},sumbl=\sum_{i=1}^n \max\{0,- b_i + tt\}\)。 若 \(B\le A\),则 \(\alpha=0\),即结果为 \(sumbr \cdot B\),否则,对 \(sumbl \ge sumbr\) 和 \(sumbl < sumbr\) 两种情况进行大力分讨,然后加上 \(\sum_{i=1}^n \max\{0,- t_i + tt\}\) 即可 ,推导仿照上例显然
我们发现,我们需要计算一段的和,因此提前排序并预处理前缀和即可。
时间复杂度 \(O(n\log n)\),理论可以优化到 \(O(n)\),瓶颈就变成了前缀和了

代码

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;
typedef unsigned long long ULL;

const int N = 100005;

int n, m;
int t[N], b[N];
ULL st[N], sb[N];
int A, B;
ULL C;

int main(){
    scanf("%d%d%lld", &A, &B, &C);
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i ++ ) scanf("%d", &t[i]);
    for (int i = 1; i <= m; i ++ ) scanf("%d", &b[i]);
    sort(t + 1, t + n + 1 ), sort(b + 1, b + m + 1);   
    for (int i = 1; i <= n; i ++ ) st[i] = st[i - 1] + t[i];
    for (int i = 1; i <= m; i ++ ) sb[i] = sb[i - 1] + b[i];
    int l = t[1], r = b[m];
    __int128 ans = 1e35;
    for (int time = l; time <= r; time ++ ) {
        int bpr = upper_bound(b + 1, b + m + 1, time) - b;
        int bpl = bpr - 1;
        int mvp = upper_bound(t + 1, t + n + 1, time) - t - 1;
        __int128 res = 0;
        if (B <= A) res = ((sb[m] - sb[bpr - 1]) - (ULL) time * (m - bpr + 1)) * B;
        else if ((sb[m] - sb[bpr - 1]) - (ULL) time * (m - bpr + 1) <= (ULL) time * bpl - sb[bpl]) res = ((sb[m] - sb[bpr - 1]) - (ULL) time * (m - bpr + 1)) * A;
        else res = (__int128) ((ULL) time * bpl - sb[bpl]) * A + (__int128) (sb[m] - sb[bpr - 1] - (ULL) time * (m - bpr + 1) - ((ULL) time * bpl - sb[bpl])) * B;
        res += (__int128) (-st[mvp] + (ULL) time * mvp) * C;
        ans = min(ans, res);
    }
> (ULL) ans);
    return 0;
}    printf("%llu\n", (ULL) ans);
    return 0;
}

标签:lnsyoj2271,省选,max,tt,int,le,ULL,cdot,联考
From: https://www.cnblogs.com/XiaoJuRuoUP/p/-/lnsyoj2271_luoguP3745

相关文章

  • 题解 P6620【[省选联考 2020 A 卷] 组合数问题】
    直接摘抄OI-wiki了。第二类斯特林数第二类斯特林数(斯特林子集数)\(\begin{Bmatrix}n\\k\end{Bmatrix}\),也可记做\(S(n,k)\),表示将\(n\)个两两不同的元素,划分为\(k\)个互不区分的非空子集的方案数。递推式\[\begin{Bmatrix}n\\k\end{Bmatrix}=\begin{Bmatrix}n-1\\k-1......
  • [十二省联考 2019] 异或粽子
    如果这道题目会可持久化trie的话,是可以用“超级钢琴”这一道题目的思路去做的如果不行的话,考虑用trie,然后这篇题解关于trie的常用trick的综合可以记住讲一下怎么查找第\(k\)大,不要用二分了,直接把\(sum_r\)放在trie树上查找。trie树每个点记录一下这个点的子树有多少个位置(这个维......
  • lg省选计划笔记-基础优化技巧1
    基础优化技巧1三分求单峰函数极值点丢弃极值点一定不在的点,注意不能用于非严格单调的函数。由于区间长度可以随便取,可以把分段点取得很近,这个时候就相当于二分斜率前面比0大,极值点处等于0,后面小于001分数规划略。模型特征:答案是比率形式(取对数可以把根式和次方转换为乘......
  • 20240726【省选】模拟
    破防了,什么SCOI2024Day1翻版,一道题可能拿100pts,一道题大多数人拿10pts,还有一道不可做,队线110/lhT1去他妈的煞笔构史题解,说了跟说了一样。这个是真的不会。容易想到对二进制每一位开一颗权值线段树或者别的啥维护,然后我就不会了……考虑将每颗权值线段树对应处理的区间......
  • 20240724【省选】模拟
    挂了四分,掉了一名,不过这也说明我的实力就只有这点,根本不够,果然以后还是直接【数据删除】得了。T1其实就是个树剖,每个点维护左右子树的最大深度以及左右子树内的最大答案,然后就…………没了?淦,也是实现问题,应该想到的。然后就是修改边权是改成\(w-a_p\),\(a_i\)是记录下来的\(i......
  • YC317A [ 20240708 CQYC省选模拟赛 T1 ] 划分(partition)
    题意给定一个长度为\(n+m\)的二进制数,你需要将这个二进制数划分别划分为长度为\(n\)的二进制数\(a\)与长度为\(m\)的二进制数\(b\)。你需要输出\(a+b\)的二进制形式。\(n\le10^6\)。Sol考虑发现一些性质。设\(n\gem\),则:考虑最优方案给\(a\)与\(b......
  • YC316B [ 20240706 CQYC省选模拟赛 T2 ] 题目描述(statement)
    题意给定两个长度为\(k\)的字符串\(s,t\)。设两个字符串的相似度为\(\sum_{i=1}^{k}[s_i=t_i]\)。给定\(n\)个操作,每次操作交换\((s_{x},s_{y})\),你需要求出对于所有\(\foralll,r,r-l+1\gem\)的相似度最大的\(l,r\)。\(n\le10^6,k\le20\)......
  • YC312A [ 20240702 CQYC省选模拟赛 T1 ] 第一题(diyiti)
    题意给定一个长度为\(n\)的可重集,以及正整数\(k\)。设一个子集的价值为子集中最大值减去最小值,你需要将这个可重集划分为\(k\)个子集,使得价值之和最小,子集需要满足不重。\(n,k\le100\)。Sol思考一下发现如果不记录每个子集的信息是不好做的。考虑将所有子集的大小记......
  • YC311A [ 20240701 CQYC省选模拟赛 T1 ] 好串(good)
    题意给定一个长度为\(n\)的\(01\)串。定义一个串是好的当且仅当该串的所有前缀以及所有后缀的\(1\)的数量大于等于\(0\)的数量。你需要维护\(q\)个查询,每次求\(S_{l,...,r}\)的子串最少添加的\(1\)的个数使得该子串是好的。Sol首先不难发现一个正确的贪心,也......
  • YC314A [ 20240704 CQYC省选模拟赛 T1 ] 士兵(solider)
    题意给定一张\(n\)个点\(m\)条边的有向图,每条边上有一个字母。\(q\)次询问,每次询问\(s\tot\)中的最短回文路径的长度是多少。\(n\le10^3,m\le10^5\)Sol区间\(\text{dp}\),设\(f_{i,j}\)表示从\(i\)到\(j\)的最短回文路径的长度。每次枚举一条边\(......