首页 > 其他分享 >Atcoder Beginer Contest 306 D ~ E

Atcoder Beginer Contest 306 D ~ E

时间:2023-07-04 19:11:17浏览次数:51  
标签:tmp Atcoder Beginer insert int s2 s1 306 dp

vp中途突然拉肚子>_<

D - Poisonous Full-Course

D - Poisonous Full-Course (atcoder.jp)

题意

一个人初始是健康的,现在有n道菜摆在他面前,每道菜都有自已的美味值,但是有些菜是有毒的,有些菜是无毒的。如果他在健康状态吃了有毒的菜就会变成中毒状态,如果他在中毒状态吃了无毒的菜就会变回健康状态,如果他在中毒状态吃了有毒的菜就会死亡。

面对依次上前的n道菜,他可以选择吃或跳过。求得在避免死亡的状态下获得最大的美味值。

思路

简单的dp,设dp[i][j]为在第i道菜时处于j状态下的最大美味值,j为0是健康,j为1是中毒。可以推得状态转移方程,当菜无毒时,dp[i][0] = max(dp[i-1][0], max(dp[i-1][1], dp[i-1][0]) + y), dp[i][1] = dp[i-1][1]。当菜有毒时,dp[i][1] = max(dp[i-1][1], dp[i-1][0] + y), dp[i][0] = dp[i-1][0]。

还可用滚动数组优化,详见代码。

代码

#include<bits/stdc++.h>

using namespace std;
using ll = long long;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    cin >> n;

    array<ll, 2> dp;
    for(int i = 0; i < n; i++) {
        int x, y;
        cin >> x >> y;
        if(x == 0) {
            dp[0] = max(dp[0], max(dp[1], dp[0]) + y);
        } else {
            dp[1] = max(dp[1], dp[0] + y);
        }
    }

    cout << max(dp[0], dp[1]) << "\n";

    return 0;
}

E - Best Performances

E - Best Performances (atcoder.jp)

题意

初始时有一个全为零的序列,然后进行若干次更改,每次更改把某个下标的数改成另一个数,每次更改后输出序列中前k个最大的数的和。

思路

用两个multiset维护前k个最大的元素和剩下的元素,再用一个数组记录真实下标对应的值,然后模拟即可。

代码

#include<bits/stdc++.h>

using namespace std;
using ll = long long;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, k, q;
    cin >> n >> k >> q;

    multiset<int> s1, s2;
    vector<int> p(n + 1);
    for(int i = 0; i < n; i++) {
        if(i < n - k) {
            s1.insert(0);
        } else {
            s2.insert(0);
        }
    }

    if(s1.empty()) {
        s1.insert(-1); //防止段错误
    }

    ll ans = 0;
    while(q--) {
        int x, y;
        cin >> x >> y;
        
        auto it = s2.find(p[x]);
        
        if(it != s2.end()) {
            ans -= p[x];
            s2.erase(it);

            if(y >= *prev(s1.end())) {
                ans += y;
                s2.insert(y);
            } else {
                auto tmp = prev(s1.end());
                ans += *tmp;
                s2.insert(*tmp);
                s1.insert(y);
                s1.erase(tmp);
            }
        } else {
            auto it = s1.find(p[x]);
            
            if(y >= *s2.begin()) {
                s2.insert(y);
                ans += y;
                auto tmp = s2.begin();
                s1.insert(*tmp);
                ans -= *tmp;
                s2.erase(tmp);
                s1.erase(it);
            } else {
                s1.erase(it);
                s1.insert(y);
            }
        }

        p[x] = y;
        cout << ans << "\n";
    }

    return 0;
}

标签:tmp,Atcoder,Beginer,insert,int,s2,s1,306,dp
From: https://www.cnblogs.com/cenqi/p/17526759.html

相关文章

  • ABC306E 题解
    题目链接题目大意维护一个数据结构,数列长度为\(n\),\(q\)次操作,每次操作修改一个位置上的值,每次操作后输出数列里前\(k\)小的数的和(\(k\)是给定的)。\(n,k,q\leq5\times10^5\)值域\(1\times10^9\)题目分析开一棵权值线段树,每个节点储存对应区间的数的个数和数的和,......
  • ABC306F 题解
    题目链接题目大意对于\(S_1\capS_2=\emptyset\),定义长度为\(|S_1|+|S_2|\)的序列\(A\),为\(S_1\cupS_2\)排序后的结果。定义二元函数\(f(S_1,S_2)=\sum\limits_{1\leqi\leq|S_1|+|S_2|}i\times[A_i\inS_1]\)。给定\(n\)个大小为\(m\)的正整数集合\(S\)......
  • AtCoder Regular Contest 163
    Preface补题,这场比赛的时候被拉去开科研组会了,所以就没现场打了这两天军训在伤病连划水,白天可以好好想题目舒服的一批这场D题确实很妙,需要一些竞赛图相关的知识才能想到转化,不过也算是学到一个重要trick了吧A-DivideString显然只要考虑能否分成两个串即可,首先如果存在\(i......
  • AtCoder Regular Contest 163 D Sum of SCC
    洛谷传送门AtCoder传送门怎么连这种相对传统的计数也不会……考虑换种方式描述强连通分量个数。考虑竞赛图缩点后存在一条极长的链,因此转化为把缩完点后的链劈成左右两个集合,使得左边集合不为空的方案数。于是我们现在只要统计点集\(A,B\)数量,满足\(A\ne\varnothing,A......
  • AtCoder Regular Contest 153 E Deque Minimization
    洛谷传送门AtCoder传送门我们考虑给定\(X\),如何贪心地求\(f(X)\)。队列为空时加入队首或队尾都是一样的。队列不为空,设队首为\(c\)。因为我们的目标是最小化字典序,于是如果\(X_i\lec\),我们把\(X_i\)加入队首,否则加入队尾。由此也容易发现,加入队首的数一定单调不升。......
  • 【20230625发布】本月学习笔记
    学习记录【20230619-20230626】Hypermesh的solidmesh功能SolidMeshPanel这个功能适用于三棱柱、四棱柱的volume。createmeshesinapentagonalorhexagonalvolumedefinedwithedgelines.e便利之处在于,只需输入lines,SolidMeshpanelrequiresavolumetobe......
  • AtCoder Beginner Contest 308 G Minimum Xor Pair Query
    洛谷传送门AtCoder传送门考虑没有删除操作怎么做。可以动态维护\(ans\),新加进来一个\(x\),我们计算\(\min\limits_{y\inS}x\oplusy\)。对\(S\)建01Trie,然后从高位往低位按位贪心,在01Trie上优先往与\(x\)这一位相同的方向走,但是前提是它的子树内有数,对于01Trie......
  • AtCoder ABC307D 题解
    AtCoderABC307DMismatchedParentheses题解思路分析First——配对括号序列首先,每个右括号肯定是要与其左边最近的左括号配对。因此,我们便可以使用一个栈来进行存放左括号的下标。当有右括号时,便可以弹出栈顶元素,但是栈为空时,便无法配对。拿样例1举个例子:8a(b(d))c......
  • AtCoder Beginner Contest 308 A~F
    AtCoderBeginnerContest308手速有点慢A-NewScheme判断给定数字是否满足条件voidsolve(){ boolok=true; inta[10]; for(inti=1;i<=8;i++) cin>>a[i]; for(inti=1;i<=8;i++) { if(i>=2&&a[i]<a[i-1]) ok=......
  • AtCoder Beginner Contest 308
    A:1#include<cstdio>2#include<cstring>3#include<algorithm>4#include<iostream>5#include<string>6#include<vector>7#include<stack>8#include<bitset>9#include<cstdlib>10#include......