“蔚来杯“2022牛客暑期多校训练营9

  • A Car Show
  • B Two Frogs
  • G Magic Spells
  • E Longest Increasing Subsequence

A Car Show

双指针算法,先移动右指针到满足从1~ i的区间内1~m的数每个至少有一个,之后移动左指针,只要满足区间内1 ~ m的数每个至少还有一个,左指针j就能一直移动,直到不满足条件。
这题还有个要注意的点是需要define intg long long,但是题中给的n、m、a都是小于1e6的,唯一可能的就是ans会爆int。

#include<bits/stdc++.h>using namespace std;#define int long longconst int N = 1e5 + 10;int n, m;
int a[N];
int ans;  //记录答案
int res;  //记录不同数的个数
int cnt[N];  //记录每个数出现过没 signed main()
{cin>>n>>m;for(int i = 1; i <= n; i ++ ){cin>>a[i];}int j = 1;  //左指针 for(int i = 1; i <= n; i ++ ){  //移动区间右指针 if(!cnt[a[i]]){res ++ ;}cnt[a[i]] ++ ;if(res == m){while(j < i && cnt[a[j]] > 1){ans += n - i + 1;cnt[a[j]] -- ;j ++ ;  //移动左指针 }ans += n - i + 1;  //这个加上的是最后一个符合条件的区间,此时a[j]=1,在while不会被计算 cnt[a[j]] -- ;j ++ ;res -- ;}}cout<<ans<<endl;return 0;
}

B Two Frogs

#include<bits/stdc++.h>using namespace std;#define int long longconst int N = 8010, mod = 998244353;int dp[N][N];  //dp[i][j]表示跳了i次到达j点的概率
int a[N];
int n;
int infac[N];  //逆元数组
int ans;
int di[N];  //一维差分数组int qmi(int a, int b){int res = 1;while(b){if(b & 1) res = res * a % mod;a = a * a % mod;b >>= 1; }return res;
}void init(){  //求逆元 for(int i = 1; i < 8000; i ++ ){infac[i] = qmi(i, mod - 2); }
}signed main()
{init();cin>>n;for(int i = 1; i < n; i ++ ) cin>>a[i];dp[0][1] = 1;for(int i = 1; i < n; i ++ ){  //枚举起点 for(int j = 1; j < n; j ++ ){   di[j + 1] = (di[j + 1] + dp[i - 1][j] * infac[a[j]] % mod + mod) % mod;di[j + a[j] + 1] = (di[j + a[j] + 1] - dp[i - 1][j] * infac[a[j]] % mod + mod) % mod;}for(int j = 1; j <= n; j ++ ){  //这里是在对到达i点的所有步骤进行差分求前缀和  dp[i][j] = (dp[i][j] + dp[i][j - 1] + di[j]) % mod;}memset(di, 0, sizeof di);}for(int i = 0; i < n; i ++ ){  //同时到达0点也包括在内 ans = (ans + dp[i][n] * dp[i][n] % mod) % mod;}cout<<ans<<endl;return 0;
}

G Magic Spells

一道题搞了两天,终于搞懂了回文自动机,还学会了马拉车算法,也算收货不小,这题是回文自动机套板子
回文自动机讲解看这里

#include<bits/stdc++.h>using namespace std;const int N = 3e5 + 10;int tr[N][27];  //建树
int n;
int ans;  //记录答案
bool cnt[5][N];  //cnt[i][j]表示在第i个魔法串内j串是否存在
int fail[N];  //fail[i]指向i的最长回文后缀子串的节点(个人认为是回文树的灵魂数组)
int len[N];  //记录节点长度
int idx;  //记录节点个数
int last;  //记录上一个新加入的节点
char s[N];  //存储字符串
int now;int newnode(int x){  //创建新节点 len[idx] = x;return idx ++ ;  //返回之后idx再++
} int getfail(int x, int n){  跳fail指针直到找到后缀回文为止,用到的两个参数都是字符串的下标 while(s[n - len[x] - 1] != s[n]) x = fail[x];return x;
}void init(){newnode(0), newnode(-1);fail[0] = 1;
}void insert(int j, int i){int t = s[j] - 'a';//找到可以回文的位置int p = getfail(last, j);  //返回的是节点编号if(!tr[p][t]){//如果有了转移就不用建了,否则要新建 //前后都加上新字符,所以新回文串长度要加2now = newnode(len[p] + 2);//因为fail指向的得是原串的严格后缀,所以要从p的fail开始找起fail[now] = tr[getfail(fail[p], j)][t];//记录转移tr[p][t] = now;}//以下两个变量不能直接用now赋值,因为tr[p][t]可能存在,此时now的值就会赋错 last = tr[p][t];cnt[i][last] = true;
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cin>>n;init();  //初始化一定不能忘了//先把所有串放到一个树内for(int i = 0; i < n; i ++ ){last = 0;cin>>s + 1;s[0] = -1;for(int j = 1; s[j]; j ++ ) insert(j, i);}for(int i = idx - 1; i > 1; i -- ){  //遍历除两个根节点之外的每个节点,沿着树从下往上遍历,因为树上层的状态没有被更新 for(int j = 0; j < n; j ++ ){  //遍历n个串cnt[j][fail[i]] |= cnt[j][i];}bool ok = true;for(int j = 0; j < n; j ++ ){if(!cnt[j][i]) ok = false;}ans += ok;}cout<<ans<<endl;  //答案是所有串中都包含的回文子串的个数 return 0;
}

E Longest Increasing Subsequence

构造类型题,先想最基础的构造,然后根据题意逐步优化
雨巨讲题 从39min开始看
代码是借鉴这个大佬的:这个讲解也很强,和雨巨的结合着更容易理解 传送门

#include<bits/stdc++.h>using namespace std;const int N = 1e6 + 10;int T;
int n;
int len;  //长度
int cnt;  //排列的长度
int cur;  //赋值游标
int ans[N];  //答案数组int main()
{cin>>T;while(T -- ){cnt = 0;len = 0;   cin>>n;if(n == 1){cout<<1<<endl<<1<<endl;continue;}for(int i = 31; i; i -- ){  //从高位向低位遍历 if(n >> i & 1){  找到第一个1,这是要个构建的基础组数(一组两个数,如21、43、65) len = i;break;}}cur = 2 * len;//    cout<<cur<<' '<<len<<"***"<<endl;for(int i = 0; i < len; i ++ ){if(n >> i & 1){  //如果遇到要补的1ans[ ++ cnt] = ++ cur;int x = i + 1;while((1 << x) <= n && !((n >> x) & 1)){  //这里循环的次数就是i到更高位1之间0的数量+1 ans[ ++ cnt] = ++ cur;x ++ ; // cout<<"x:"<<x<<endl;}}ans[ ++ cnt] = 2 * i + 2;ans[ ++ cnt] = 2 * i + 1;}cout<<cnt<<endl;for(int i = 1; i <= cnt; i ++ ){cout<<ans[i]<<' ';}cout<<endl;}return 0;
}

“蔚来杯“2022牛客暑期多校训练营9 补题题解(A、B、G、E)相关推荐

  1. “蔚来杯“2022牛客暑期多校训练营10补题

    H  Wheel of Fortune 题意 有两个人在打炉石,一方转动了尤格萨隆的命运之轮触发了炎爆选项.双方英雄的血量分别为A和B,双方场面的血量分别为ai和bi,问A获胜的概率. 思路 将代码分 ...

  2. “蔚来杯“2022牛客暑期多校训练营8 D题: Poker Game: Decision

    D题: Poker Game: Decision 原题链接:https://ac.nowcoder.com/acm/contest/33193/D 题目大意 在德州扑克的大小比较规则情况下,发牌顺序与 ...

  3. “蔚来杯“2022牛客暑期多校训练营7 L Maximum Range(强连通缩点+网络流输出方案)

    "蔚来杯"2022牛客暑期多校训练营7 L Maximum Range(强连通缩点+网络流输出方案) 题意 找一个环 上面的边权 极差最大 并输出 点 思路 我们先强联通缩点 统计 ...

  4. “蔚来杯“2022牛客暑期多校训练营1

    "蔚来杯"2022牛客暑期多校训练营1 C Grab the Seat! D Mocha and Railgun 题意: 给定一个圆环,中心为(0, 0).给定T个查询,每次给定环 ...

  5. “蔚来杯“2022牛客暑期多校训练营6

    "蔚来杯"2022牛客暑期多校训练营6 [题目链接]("蔚来杯"2022牛客暑期多校训练营6_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛 ...

  6. “蔚来杯“2022牛客暑期多校训练营10,签到题HFIE

    题号 标题 已通过代码 通过率 团队的状态 A Everlasting Transeunt 点击查看 6/42 B Fall Guys-Perfect Match 点击查看 6/115 C Magic ...

  7. “蔚来杯“2022牛客暑期多校训练营8

    Equivalence in Connectivity 前置知识点如下: 1. 并查集哈希 2. 可撤销并查集 3. 线段树分治 #include<bits/stdc++.h> using ...

  8. “蔚来杯“2022牛客暑期多校训练营2 G.[Link with Monotonic Subsequence] 分块构造

    G. Link with Monotonic Subsequence 构造 题目分析 要求构造一个长度为 n n n的序列,使得序列的 max ⁡ ( lis ( p ) , lds ( p ) ) ...

  9. “蔚来杯“2022牛客暑期多校训练营2 个人题解集合

    文章目录 D.[Link with Game Glitch](https://ac.nowcoder.com/acm/contest/33187/D) 题目分析 Code G.[ Link with ...

最新文章

  1. 最大流 ---- 最小路径覆盖 ---- P2765魔术球问题(网络流24题)
  2. 开发者数量2025年预计破亿,GitHub最新年度报告来啦!
  3. 华为发布面向2025十大趋势
  4. 自定义顶部菜单navigationBar方式
  5. 静态链接库和动态链接库(转)
  6. nyoj-37 回文字符串
  7. Vue状态管理vuex
  8. mysql各种联结的区别_mysql几种连接方式区别
  9. python截取关键字后的字符串_使用正则表达式获取python中特定字符串之后的所有内容...
  10. 文件描述符(0、1、2)的用法
  11. 植物大战僵尸全明星服务器维修多长时间,植物大战僵尸全明星常见问题FAQ详解...
  12. 计算机网络的现状分析,计算机网络技术的发展现状和趋势分析.doc
  13. Codeforces - 1152B - Neko Performs Cat Furrier Transform
  14. 收集最火的开源项目——PHP 篇
  15. 《东周列国志》第二十九回 晋惠公大诛群臣 管夷吾病榻论相
  16. 无线服务器功能,无线自组织互联网的用户管理——Radius服务器的功能设计与实现...
  17. 开放性金融中的超流动性抵押链
  18. ImportError: cannot import name ‘get_all_providers‘ from ‘onnxruntime.capi._pybind_state‘
  19. python绘制三维矢量图_开源图形库 c语言-图形图像库 集合
  20. 关于合著《区块链实战》的 3 组关键词 | ArcBlock 博客

热门文章

  1. 基于bootstrap的富文本编辑器summernote的用法
  2. 绿色循环圈英雄塔攻略
  3. CSS优先级的一些理解
  4. 在迅捷CAD编辑器中如何画点划线?
  5. 入职两周,怀疑自己进了假百度!跟传说中完全不一样!难道真有两家百度公司?
  6. 如何做一个基于微信体育馆预约小程序系统毕业设计毕设作品
  7. java不确定人数扑克牌发牌技巧_汪峰被曝系德州扑克高手 善于计算发牌概率(图)...
  8. 《MATLAB智能算法30个案例》:第30章 极限学习机的回归拟合及分类——对比实验研究
  9. Qt个性化系统托盘的实现(电脑管家)
  10. 查题公众号免费搭建-内附题库