首页 > 其他分享 >2024牛客暑期多校训练营2

2024牛客暑期多校训练营2

时间:2024-07-20 16:09:00浏览次数:15  
标签:int 多校 2024 牛客 num prey prex date dp

H.Instructions Substring
题目大意:给出一段长为 \(n\) 的字符串,其中WASD分别代表向上下左右走,给出目的地 \((x,y)\) ,选择一段连续子序列使得从 \((0,0)\) 出发可以经过目的地,求这样的子序列的总数。
思路:用前缀和记录到 \(i\) 为止到达的位置,从前往后遍历右端点 \(r\) ,找到恰好到达目的地的 \(l\) 的数量,即 \(prex[i]-x,prey[i]-y\) 的数量,这些数量可以使 \(r\) 到 \(n\) 的所有右端点成立(经过目的地)。做完后将这些已经用过的前端点归0,防止后面的后端点再次使用而重复。
注意:由于一开始就在(0,0),若目的地为(0,0)则需特判;

点击查看代码
#include<bits/stdc++.h>
#define int long long
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
#define pb push_back
const int N = 9e6 + 10;
using namespace std;
const int mod = 998244353;

int prex[200005],prey[200005];

map<pair<int,int> ,int>mp;
void solve(){
    int n,x,y;cin>>n>>x>>y;
    for(int i=1;i<=n;i++){
        char c;cin>>c;
        if(c=='D'){
            prex[i]=prex[i-1]+1;
            prey[i]=prey[i-1];
        }
        else if(c=='A'){
            prex[i]=prex[i-1]-1;
            prey[i]=prey[i-1];
        }
        else if(c=='S'){
            prex[i]=prex[i-1];
            prey[i]=prey[i-1]-1;
        }else {
            prex[i]=prex[i-1];
            prey[i]=prey[i-1]+1;
        }
    }
    if(x!=0||y!=0) mp[{0,0}]++;
    int ans=0;
    for(int i=1;i<=n;i++){
        mp[{prex[i], prey[i]}]++;
        ans+=mp[{prex[i]-x,prey[i]-y}]*(n-i+1);
        mp[{prex[i]-x,prey[i]-y}]=0;
    }
    cout<<ans<<'\n';
}
signed main(){
    ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
    int _=1;
//    cin>>_;
    while(_--)solve();
}

I:Red Playing Cards
题目大意:有 \(2*n\) 张牌,牌上数字为 \(1-n\) 的牌每种两张,你可以选择数字相同的两张牌将他们以及他们中间的牌删去,并获得选择的数字乘删去牌的数量的贡献,求删到不可删为止的最大贡献。
思路:用 \(mx[num]\) 表示 \(num.l\) 到 \(num.r\) 可实现的最大贡献,用 \(dp[i]\) 表示 \(i\) 到 \(num.l\) 的最大贡献。从大到小更新 \(mx[num]\) 的值, \(date[i]\) 存储 \(i\) 位置上的数。
1.如果两 \(num\) 之间的牌的值都比 \(num\) 小,那么一定删去这两个相同数字,并得到 \(dp[num.r]\) 的贡献。E:5123412345,一定删去5,得到50的贡献。
2.如果两 \(num\) 之间 \(i\) 位置上出现一张牌的值为 \(k\) ,且 \(k>num\) 那么就判断是删去这个大数的最大贡献大还是不删更大。\(dp[i]=max(dp[i],dp[date[i].l]+dp[k])\) 。
3.由于数字0的贡献与长度无关,在原数列两头加上0,就可以得到 \(1\) 到 \(2*n\) 的最大贡献 \(mx[0]\) 。

点击查看代码
#include<bits/stdc++.h>

#define int long long
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
#define pb push_back
const int N = 9e6 + 10;
using namespace std;
const int mod = 998244353;

struct num{
    int l,r;
}a[N];

vector<int>mx(N),dp(N),date(N);

void solve() {
    int n;
    cin >> n;
    for(int i=2;i<=2*n+1;i++){
        int num;
        cin >> num;
        date[i]=num;
        if(a[num].l) a[num].r=i;
        else a[num].l=i;
    }
    a[0].l=1;
    a[0].r=2*n+2;
    date[1]=date[2*n+2]=0;
    for(int i=n;i>=0;i--){
        int l=a[i].l,r=a[i].r;
        dp[l-1]=0;
        for(int j=l;j<=r;j++){
            dp[j]=dp[j-1]+i;
            if(date[j]>i&&a[date[j]].l>l&&a[date[j]].r==j){
                dp[j]=max(dp[j],dp[a[date[j]].l-1]+mx[date[j]]);
            }
        }
        mx[i]=dp[r];
    }
    cout << mx[0];
}

signed main() {
    ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
    int _ = 1;
//    cin>>_;
    while (_--)solve();
}

标签:int,多校,2024,牛客,num,prey,prex,date,dp
From: https://www.cnblogs.com/yoez123/p/18313260

相关文章

  • 2024杭电第一场
    1012并考虑两维坐标都离散化后枚举每个格子,用二维前缀和计算其被覆盖的次数,设为cnt则k固定时该格子的贡献为:(1-C[n-cnt][k]/C[n][k])*该格子的面积注意事项:1.处处取模2.给的是点坐标,不是格点坐标,因此计算二维前缀和时要x++,y++#include<bits/stdc++.h>usingnames......
  • NOI2024退役记
    本文仍在不断更新中不知不觉我的OI生涯就结束了,走到这一步才突然发觉。才想起来我还有好多感兴趣的内容没学,还有好多有趣的题没做,还有好多流逝的时间没有抓住。但是都已经走到这一步了,高中的OI之旅就也只能到此为止了。Day-?提前两周来到了重庆,跟着梦熊的模拟赛,又认识了一个......
  • 【2024-ZR-C Day 4】图论(1)
    1.强连通分量1.1.定义在有向图中,选取一个点集\(S\),若对于\(S\)中的任意两点\(u,v\),都满足\(u\)可以到达\(v\),则称\(S\)是强连通的。强连通分量是图中一个极大的强连通的点集。性质:把一个有向图通过强连通分量缩点后,新的图是一个DAG.1.2.Kosaraju算法在无向图......
  • 牛客小白月赛98补题
    D一道很典型的区间DP//区间DP典题#include<bits/stdc++.h>usingnamespacestd;#definelllonglongconstintN=520;lln,L,R;strings;llsum0[N],sum1[N];llf[N][N];voidsolve(){cin>>n>>L>>R>>s;s='......
  • C基础(学习)2024.7.19
             Linux基本命令,vi编译器的使用,简单的编程步骤,程序语言,gcc编译器编译过程,进制转换相关知识可以查看文档http://t.csdnimg.cn/CmqhC        数值表示,词法符号,变量,常量相关知识可以查看文档http://t.csdnimg.cn/jJIe2        运算符和输表达式......
  • 2024/7/20周末总结
    本周,我完美完成了PTA基础编程题目集中的函数部分。对阶乘计算的进阶方法这道上周无法通过的题目进行了学习和复现通过。对超大数的输出方式有了新的理解。同时,完成了编程题三分之一的题目,其中,由于BCD数中需要实现位运算而有些难以理解外,其他均以C++通过。关于本周Java的学习,......
  • 【北航主办丨本届SPIE独立出版丨已确认ISSN号】第三届智能机械与人机交互技术学术会议
    由北京航空航天大学指导,北京航空航天大学自动化科学与电气工程学院主办,AEIC学术交流中心承办的第三届智能机械与人机交互技术学术会议(IHCIT2024)将定于2024年7月27日于中国杭州召开。大会面向基础与前沿、学科与产业,旨在将“人工智能”、“智能系统”和“人机交互”等学......
  • 2024暑假集训测试6
    前言比赛链接。挂分挂的最多的一集。T1不知道摩尔投票,被2M内存限制卡死。T2赛时打了个很像正解的莫队,赛时出题人发现了之后现往里加hack,还一个捆绑里加一个,直接爆零了,我真的谢了,求求以后不要一个捆绑放一个hack了,给条活路吧。T3一眼看出线段树优化建图,但是不会打......
  • 2024牛客暑期多校训练营1
    A:ABitCommon题目大意:建立一个长度为n且每个数严格小于\(2^m\)的非空序列A使其存在一个非空子序列B,B中所有元素的与运算结果为1,输出合法A序列的个数。思路:存在子序列合法即该序列合法,其他元素无要求。即可以枚举合法子序列的长度,其他元素均为必定非合法整数。又因为需要结果为......
  • 小欧吃苹果-OPPO 2024届校招正式批笔试题-数据开发(C卷)
    在处理这个问题前,先看一个经典的贪心算法题目。信息学奥赛一本通(C++版)在线评测系统http://ybt.ssoier.cn:8088/problem_show.php?pid=1320注意移动纸牌的贪心策略并不是题目中给出的移动次序:第1堆纸牌9<10,因为是最左侧,它只能从第2堆移动过来一张,这个动作是必须做的(没有别的......