「LibreOJ NOIP Round #1」DNA 序列

注意到 \(k=10\),\(|\Sigma|=4\),故本质不同的子串个数只有 \(4^{10}\) 种,可以直接压位存下来。

时间复杂度 \(O(nk)\)。

Code
  1. const int N=5e6+5;
  2. char ch[N];
  3. int n,K,bl[N];
  4. int turn(char ch) {
  5. if(ch=='A') return 0;
  6. if(ch=='C') return 1;
  7. if(ch=='G') return 2;
  8. if(ch=='T') return 3;
  9. assert(0);
  10. }
  11. int main() {
  12. scanf("%s",ch+1);
  13. scanf("%d",&K);
  14. n=strlen(ch+1);
  15. int ans=0;
  16. FOR(i,1,n-K+1) {
  17. int sum=0;
  18. FOR(j,1,K) sum=4*sum+turn(ch[i+j-1]);
  19. bl[sum]++,ans=max(ans,bl[sum]);
  20. }
  21. printf("%d\n",ans);
  22. }

「LibreOJ NOIP Round #1」数列递推

注意到当 \(a_{i+1},a_{i}\) 同号时序列单增/单减,故考虑暴力递推直到序列单增单减,特殊记录前面的答案即可。

可以证明前面只有 \(\log a_i\) 项,故时间复杂度 \(O(T\log a_i)\)。

Code
  1. const int M=3e5+5;
  2. const __int128 inf=1e18;
  3. int v[M];
  4. map<int,int> app;
  5. int main() {
  6. int m;scanf("%d",&m);
  7. FOR(i,1,m) scanf("%d",&v[i]),app[v[i]]=1;
  8. int q;scanf("%d",&q);
  9. while(q--) {
  10. int a0,a1,k;
  11. scanf("%d %d %d",&a0,&a1,&k);
  12. if(a0==0&&a1==0) {
  13. printf("%d %d\n",v[1],v[1]);
  14. continue;
  15. }
  16. __int128 a=a0,b=a1,c,ma=-inf,mi=inf;
  17. int o1=0,o2=0,i,op;
  18. if(app[0]) ma=mi=a0;
  19. if(app[1]) {
  20. if(ma<a1) ma=a1,o1=1;
  21. if(mi>a1) mi=a1,o2=1;
  22. }
  23. for(i=2;;i++) {
  24. c=a+b*k;
  25. if(c>inf||c<-inf) {
  26. if(c>inf&&i<v[m]) o1=v[m];
  27. else if(i<v[m]) o2=v[m];
  28. break;
  29. }
  30. if(app[i]) {
  31. if(ma<c) ma=c,o1=i;
  32. if(mi>c) mi=c,o2=i;
  33. }
  34. a=b,b=c;
  35. }
  36. if(o1==0) o1=v[1];
  37. if(o2==0) o2=v[1];
  38. printf("%d %d\n",o1,o2);
  39. }
  40. }

「LibreOJ NOIP Round #1」旅游路线

考虑 DP,记 \(f_{u,i}\) 表示现在在 \(u\),手里有 \(i\) 块钱,准备在 \(u\) 这个位置加油,可以得到的最大路程,有转移:

\[f_{u,i}=\max_v (f_{v,i-p_u}+w_{u,v,\min(C,c_u)})
\]

其中 \(w_{u,v,i}\) 表示从 \(u\) 到 \(v\) 至多走 \(i\) 步得到的最大路程。

注意到对于任意一个 \(u\),\(\min(C,c_u)\) 是固定的,考虑使用倍增来加速这个求的过程,记 \(g_{u,v,d}\) 表示 \(u\) 到 \(v\) 走至多 \(2^d\) 步的最大路程,有转移:

\[g_{u,v,d}=\max(g_{u,v,d-1},\max_x(g_{u,x,d}+g_{x,v,d}))
\]

那么 \(w\) 也可以转移出来:

\[w_{u,v,x}=\max_y(w_{u,y,x-2^k}+g_{y,v,k})
\]

DP 即可,询问时二分一下就行。

总时间复杂度 \(O(n^3\log V+n^4+T\log V)\)。

Code
  1. const int N=105,inf=1e9;
  2. int n,m,C,Q;
  3. int p[N],c[N],g[N][N][17],f[N][N*N],w[N][N],a[N],b[N];
  4. int main() {
  5. scanf("%d %d %d %d",&n,&m,&C,&Q);
  6. FOR(i,1,n) {
  7. scanf("%d %d",&p[i],&c[i]);
  8. c[i]=min(c[i],C);
  9. }
  10. FOR(i,1,n) FOR(j,1,n) FOR(k,0,16) g[i][j][k]=-inf;
  11. FOR(i,1,n) g[i][i][0]=0;
  12. FOR(i,1,m) {
  13. int x,y,v;
  14. scanf("%d %d %d",&x,&y,&v);
  15. chkmax(g[x][y][0],v);
  16. }
  17. FOR(k,1,16) FOR(i,1,n) FOR(j,1,n) {
  18. chkmax(g[i][j][k],g[i][j][k-1]);
  19. FOR(x,1,n) chkmax(g[i][j][k],g[i][x][k-1]+g[x][j][k-1]);
  20. }
  21. FOR(i,1,n) {
  22. FOR(j,1,n) a[j]=-inf;
  23. a[i]=0;
  24. FOR(l,0,16) if(c[i]&(1<<l)) {
  25. FOR(j,1,n) b[j]=a[j];
  26. FOR(j,1,n) FOR(k,1,n) chkmax(b[k],a[j]+g[j][k][l]);
  27. FOR(j,1,n) a[j]=b[j];
  28. }
  29. FOR(j,1,n) w[i][j]=a[j];
  30. }
  31. FOR(i,0,n*n) FOR(u,1,n) if(i>=p[u]) FOR(v,1,n) chkmax(f[u][i],f[v][i-p[u]]+w[u][v]);
  32. while(Q--) {
  33. int s,q,d;
  34. scanf("%d %d %d",&s,&q,&d);
  35. int x=lower_bound(f[s],f[s]+q+1,d)-f[s];
  36. if(x>q) puts("-1");
  37. else printf("%d\n",q-x);
  38. }
  39. }

「BalkanOI 2018」Election

C 看成 \(1\),将 T 看成 \(-1\),问题变为删去若干 T 后使前缀和 \(pre_i\ge 0\),后缀和 \(suf_i\ge 0\)。

考虑先操作使得前缀和合法,此时的操作是,对于每一个第一次出现的前缀和为 \(-i\),删去这个字母,操作次数为 \(-\min pre_i\),此时的 \(suf_i\) 会变化,设变化后的是 \(suf'_i\),则代价同样是 \(-\min suf'i\)。

尝试求出 \(suf'_{\min}\),考虑某一个位置 \(p\),其没被加到的情况是 \(-\min_{i<p}pre_q\),故其后缀和为 \(suf_p+\min_{i<p}pre_i-pre_{\min}\)。

故答案为 \(-\min_{p<q}(pre_p+suf_q)\),可以转化为总和减去中间一段,中间一段是最大子段和,线段树维护即可。

时间复杂度 \(O(n\log n)\)。

Code
  1. const int N=5e5+5;
  2. char ch[N];
  3. int val[N];
  4. struct node {int lma,rma,dat,sum;} tr[N*4];
  5. node operator + (node a,node b) {
  6. node ret;
  7. ret.sum=a.sum+b.sum;
  8. ret.lma=max(a.lma,a.sum+b.lma);
  9. ret.rma=max(b.rma,b.sum+a.rma);
  10. ret.dat=max({a.dat,b.dat,a.rma+b.lma});
  11. return ret;
  12. }
  13. void build(int p,int l,int r) {
  14. if(l==r) {
  15. tr[p]={max(val[l],0),max(val[l],0),max(val[l],0),val[l]};
  16. return;
  17. }
  18. int mid=(l+r)>>1;
  19. build(p*2,l,mid),build(p*2+1,mid+1,r);
  20. tr[p]=tr[p*2]+tr[p*2+1];
  21. }
  22. node query(int p,int l,int r,int x,int y) {
  23. if(x<=l&&r<=y) return tr[p];
  24. int mid=(l+r)>>1;
  25. if(x>mid) return query(p*2+1,mid+1,r,x,y);
  26. if(y<=mid) return query(p*2,l,mid,x,y);
  27. return query(p*2,l,mid,x,y)+query(p*2+1,mid+1,r,x,y);
  28. }
  29. int main() {
  30. int n=read();scanf("%s",ch+1);
  31. FOR(i,1,n) {
  32. if(ch[i]=='C') val[i]=1;
  33. else val[i]=-1;
  34. }
  35. build(1,1,n);
  36. int q=read();
  37. while(q--) {
  38. int l=read(),r=read();
  39. node ret=query(1,1,n,l,r);
  40. printf("%d\n",ret.dat-ret.sum);
  41. }
  42. }

2022.11.08 NOIP2022 模拟赛五的更多相关文章

  1. 11/1 NOIP 模拟赛

    11.1 NOIP 模拟赛 期望得分:50:实际得分:50: 思路:暴力枚举 + 快速幂 #include <algorithm> #include <cstring> #in ...

  2. 11.7 NOIP模拟赛

    目录 2018.11.7 NOIP模拟 A 序列sequence(two pointers) B 锁lock(思路) C 正方形square(埃氏筛) 考试代码 B C 2018.11.7 NOIP模 ...

  3. ZROI 19.08.07模拟赛

    传送门 写在前面:为了保护正睿题目版权,这里不放题面,只写题解. "正睿从来没有保证,模拟赛的题目必须原创." "文案不是我写的,有问题找喵老师去."--蔡老师 ...

  4. ZROI 19.08.09模拟赛

    传送门 写在前面:为了保护正睿题目版权,这里不放题面,只写题解. A \(70pts:\) 维护一个栈,从一侧向另一侧扫描,如果新加入的元素与当前栈顶相同,则出栈,否则进栈.显然一个子串是括号序列,当 ...

  5. ZROI 19.08.06模拟赛

    传送门 写在前面:为了保护正睿题目版权,这里不放题面,只写题解. 今天正睿又倒闭了,从删库到跑路. 天祺鸽鸽txdy! A "不要像个小学生一样一分钟就上来问东西."--蔡老板 虽 ...

  6. 2019/11/12 CSP模拟赛&&考前小总结

    写在前面的总结 离联赛只有几天了,也马上就要回归文化课了. 有点舍不得,感觉自己的水平刚刚有点起色,却又要被抓回文化课教室了,真想在机房再赖几天啊. 像19/11/11那场的简单题,自己还是能敲出一些 ...

  7. 计蒜客蓝桥杯模拟赛五J. 程序设计:放置守卫

    在一张 n 行 m 列的方格地图上放置一些守卫,每个守卫能守护上.左.右三个方向上相邻的方格和自己所在的方格.如下图,红色的方格放置守卫,绿色的方格为该守卫守护的区域. 现在要求在地图上放置若干个守卫 ...

  8. 2018.11.08 NOIP模拟 班车(倍增+dfs+bit)

    传送门 对于每个点离线处理出向上走2i2^i2i班车到的最上面的点. 然后每个询问(u,v)(u,v)(u,v)先把(u,v)(u,v)(u,v)倍增到刚好走不到lcalcalca的情况(有一个点如果 ...

  9. 2018.11.08 NOIP模拟 水管(简单构造)

    传送门 仔细读题会发现只要所有点点权之和等于0一定有解. 如何构造? 直接当做树来构造就行了,非树边都赋值成0就行. 代码

  10. 2018.11.08 NOIP模拟 景点(倍增+矩阵快速幂优化dp)

    传送门 首先按照题意构造出转移矩阵. 然后可以矩阵快速幂求出答案. 但是直接做是O(n3qlogm)O(n^3qlogm)O(n3qlogm)的会TTT掉. 观察要求的东西发现我们只关系一行的答案. ...

随机推荐

  1. vue 状态类展示使用红绿圆点

    vue 状态类展示使用红绿圆点通常对于一些在线.离线类的展示使用图标展示比使用文字描述会更加清晰直观.项目中使用的代码如下: HTML <el-table-column prop="s ...

  2. P1002 [NOIP2002 普及组] 过河卒

    P1002 [NOIP2002 普及组] 过河卒 题目见上. 一个经典的递推题 递推不会的看下面: https://www.cnblogs.com/haoningdeboke-2022/p/16247 ...

  3. Traefik官方文档以及翻译文档

    https://www.qikqiak.com/traefik-book/ https://doc.traefik.io/traefik/

  4. iOS ProtocolBuffer使用介绍

    ProtocolBuffer 简介 Protocol Buffer 是google 的一种数据交换的格式 Protocol Buffer 和 XML.JSON一样都是结构数据序列化的工具,但它们的数据 ...

  5. xxx.app 已损坏,无法打开,你应该将它移到废纸篓/打不开 xxx,因为它来自身份不明的开发者解决方法

    xxx已损坏,无法打开,你应该将它移到废纸篓解决办法 打不开 xxx,因为它来自身份不明的开发者 打不开xxxx,因为 Apple 无法检查其是否包含恶意软件 在安装的时候提示加载失败! 解决: 打开 ...

  6. ES6 新语法新特性总结中...

    1. 感觉 for of   通杀 for循环 和 for in呢 aaa 可以是array /object for (let k of aaa) {     console.log(k) }   2 ...

  7. django的模型层(二)

    django的模型层(二) 一 创建模型 from django.db import models # Create your models here. class Author(models.Mod ...

  8. 使用nvm实现自由切换nodejs版本

    首先安装使用nvm前需要删除卸载干净!!! 可以去GitHub安装最新的版本:https://github.com/nvm-sh/nvm 或者直接下载Windows的 releases版本安装:htt ...

  9. Spring中最常用的11个扩展点

    转载自: 微信公众号 [Java后端技术] 前言 我们一说到spring,可能第一个想到的是 IOC(控制反转) 和 AOP(面向切面编程). 没错,它们是spring的基石,得益于它们的优秀设计,使 ...

  10. shell_Day06

    sed命令 Linux文本处理三剑客 之 sed sed stream EDite 作为行编辑器,对文本进行编辑(以行为单位进行编辑) 注意:sed编辑文件,却不改变原文件: sed的工作原理: 指定 ...