2018.11.1模拟赛总结

贪心 + 堆

因为可以不选满,所以可以把小于 \(0\) 的值赋值为 \(0\), 先考虑按 \(a_i\) 从大到小排序, 然后考虑选择 \([A + 1 \dots n]\) 中最大的 \(b_i\).但是这样不一定会成为最优解,我们从 \(A + 1\) 开始向 \(A + B\) 扫描,每一次尝试放弃前面的一个 \(a_i\) , 然后用当前的物品更新 \(a_i\) 的答案。前者可以通过用一个包含了第 \(A\) 个物品的 \(b_i - a_i\) 的 \(set\) 维护,后者可以通过最大堆维护。

每次更新答案的过程中需要把当前物品的 \(b_i - a_i\) 插到 \(set\) 中去,因为可以返回,所以在这之后可能被取出

时间复杂度 \(nlogn\)

#include <set>
#include <queue>
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;

const int maxn = 1e5 + 10;

typedef pair<int, int> P;
#define A first
#define val first
#define B second

P a[maxn];

int n, la, lb;
int now, ans;

set<P> s1;
priority_queue<P> s2;

int main() {
    scanf("%d%d%d", &n, &la, &lb);
    for (int i = 1; i <= n; ++ i)
        scanf("%d", &a[i].A), a[i].A = max(a[i].A, 0);
    for (int i = 1; i <= n; ++ i)
        scanf("%d", &a[i].B), a[i].B = max(a[i].B, 0);
    sort(a + 1, a + n + 1); reverse(a + 1, a + n + 1);
    for (int i = n; i > la; -- i) {
        now += a[i].B;
        s1.insert(P(a[i].B, i));
        if (s1.size() > lb) {
            now -= s1.begin() -> val;
            s1.erase(s1.begin());
        }
    }
    for (int i = 1; i <= la; ++ i) {
        s2.push(P(a[i].B - a[i].A, i));
        now += a[i].A;
    }
    ans = now;
    for (int i = la + 1; i <= la + lb; ++ i) {
        set<P>::iterator it = s1.find(P(a[i].B, i));
        if (it != s1.end()) {
            now -= it -> val;
            s1.erase(it);
        } else {
            it = s1.begin();
            now -= it -> val;
            s1.erase(it);
        }
        s2.push(P(a[i].B - a[i].A, i));
        now += a[i].A;
        now += s2.top().val; s2.pop();
        ans = max(ans, now);
    }
    cout << ans << endl;
}

原文地址:https://www.cnblogs.com/Alessandro/p/9889945.html

时间: 2024-08-30 15:20:37

2018.11.1模拟赛总结的相关文章

树的dfs序,p1539,其他经典问题,2018/11/08模拟赛T3

树的dfs序指从根节点进行dfs(先序遍历),每次到达某个点的时间和离开这个点的时间.它可以将树上的问题转换成序列问题进行处理. 比如对于p1539的样例可以这样解释. 每个点的左边数字表示进入该点的"时间",右边的数字表示离开该点的"时间".对dfs序的介绍就到这里. 然后来看一个例题: 先读入边,跑一遍dfs确定dfs序. 对于操作1,把点x的进入的"时间"+=a,把x出去的"时间"-=a 这样操作3询问根节点到y的路径点

2017.6.11 校内模拟赛

题面及数据及std(有本人的也有原来的) :2017.6.11 校内模拟赛 T1 自己在纸上模拟一下后就会发现 可以用栈来搞一搞事情 受了上次zsq 讲的双栈排序的启发.. 具体就是将原盘子大小copy一下排个序 用两个指针维护两个数组(原数据 和 排序后的数据), 即分为1数据和2数组 将小于1指针指向的数据的2数组中的数据全部压入栈中 后进行消除, 将栈栈顶元素与当前1数组中的1指针指向的元素进行比较 相同则消除 后重复过程 直至指针超过N 后判断一下是否两个指针都超过了N... #incl

11.27 模拟赛

并没有人做的模拟赛... 出题人hx,,, T1:就是上一道矩阵乘法 数学题 T2: 一个数列中 一个区间满足,存在一个k(L <= k <= R),并且对于任意的i (L <= i <= R),ai都能被ak整除 这样的一个特殊区间 [L, R]价值为R - L 想知道序列中所有特殊区间的最大价值是多少,而有多少个这样的区间呢 这些区间又分别是哪些呢 输出每个区间的L 思路: 用两个ST表分别求一段区间的gcd和最小值 然后可以二分答案 check的时候枚举左端点,判断在这段区间

2017 9 11 noip模拟赛T2

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=205; int map[N][N]; int d[N],tag[N],book[N],f[N]; int n,m; void work(int x) { memset(d,63,sizeof(d)); memset(book,0,sizeof(book)); memset(f,0,sizeof(

2018/5/24模拟赛总结

shzr带病AK虐爆全场... T1n皇后: 这题没啥好说的... T2有重复元素的排列问题: [问题描述] 设R={ r1, r2 , -, rn}是要进行排列的n个元素.其中元素r1, r2 , -, rn可能相同.试设计一个算法,列出R的所有不同排列. [编程任务] 给定n 以及待排列的n 个元素.计算出这n 个元素的所有不同排列. [输入格式] 由perm.in输入数据.文件的第1 行是元素个数n,1≤n≤500.接下来的1 行是待排列的n个元素. [输出格式] 计算出的n个元素的所有不

11.4 模拟赛

终于AK了,虽然第三题主要是搞月想出来的 T1: n个1*1的小方块,把这些小方块拼成一个图形,使这个图形周长最小 思路: 枚举拼成长方形的长为i,宽为n/i 可得面积 (i+n/i+(bool)(n%i))*2 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstdlib> 5 #include<cmath> 6 #include<cstr

2017/11/3模拟赛

块(block)[问题描述]拼图达人小 C 手里有 n 个 1*1 的正方形方块, 他希望把这些方块拼在一起, 使得拼出的图形周长最小, 要求方块不能重叠. 擅长拼图的小 C 一下就求出了这个周长, 顺便他想考考你会不会求.[输入格式]多组数据, 第一行一个正整数 T, 表示数据组数.接下来 T 行, 每行一个正整数 n, 表示方块数.[输出格式]输出 T 行, 每行一个正整数, 表示答案.[样例输入]3 4 1122[样例输出]81420[数据范围]对于 20%的数据, n<=20:对于 40

2017/11/1模拟赛

磁星(magnet)[题目描述]在 B 城呆惯了的小 H 决定去外太空溜达一圈.人类现已发现并开发的星球(包括小 H 所在的星球)有 n 个,并且在这 n 个星球之中,人们发现了 m 对两个星球的关系.关系"xy"表示的是星球 x 对星球 y 有 1 一个单位的引导力,由于引导力还具有传递性,如果星球 x 对星球 y 能有恰好 a 个单位的引导力,星球y 对星球 z 能有恰好 b 个单位的引导力,那么星球 x 对星球 z 就能有恰好 a+b 个单位的引导力. 换言之,星球 x 对星球

11.2 模拟赛

T1: tarjan裸不能再裸了 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<cstdlib> 6 #include<cmath> 7 #include<vector> 8 #include<queue> 9 #define inf 2147483611 10 #defi